Académique Documents
Professionnel Documents
Culture Documents
Autor: Ueli 25. maro 2011 21:24 At as aplicaes mais simples costumam ter diferentes tabelas, relacionadas entre elas. bem comum ter que criar uma tela com um grid que junta os dados de duas tabelas. Exemplo: Temos uma aplicao que organiza os contatos de um gerente de vendas. Existem duas tabelas, uma para empresas e outra para pessoas. Uma pessoa pode ser ligada a uma empresa. Uma viso tpica neste caso uma lista com detalhe (Master-Detail em ingls). Selecionada uma empresa na lista (1) aparecem em uma segunda coluna as pessoas ligadas quela empresa (2):
Em alguns casos queremos uma lista mais simples, por exemplo para poder exportar para Excel, do tipo Empresa / Pessoa / Tel Pessoa / Tel Empresa:
Banco do Brasil / Melinda Bieber / 31 4444-4444 / 31 1234-1234 Banco do Brasil / Clara Oliveira / 31 2222-2222 / 31 1234-5678 Cemig / Joo Silva / 31 1234-5678 / 31 1111-1111 Cemig / Alfredo Costa / 31 2345-6789 / 31 1111-1111 Vale / Rodolfo Togati / 31 9876-5435 / 31 8888-8888
Alm do nmero de telefone da pessoa queremos listar tambm o nmero da empresa, caso a pessoa no esteja disponvel no momento. bem fcil fazer isso com Visual Studio LightSwitch, sem escrever nenhuma linha de cdigo.
Pr-requisitos
Para acompanhar este tutorial voc deveria saber como
Criar uma nova soluo LightSwitch Adicionar uma tabela Adicionar uma relao entre tabelas Adicionar uma tela
Resultado
Ao final vamos ter uma aplicao com a seguinte tela:
Observao: LightSwitch autmaticamente chama a tabela de "PessoaSet". Em seguido precisamos adicionar uma relao da tabela "Pessoa" para a tabela "Empresa". A Multiplicity "Many : Zero or one" e o Delete Behaviour "Restricted":
LightSwitch chama a tela automaticamente de "EmpresaSetListDetail" o que vamos deixar deste jeito. Executamos o que j temos para adicionar algumas empresas e pessoas:
Atualmente a empresa aparece na terceira coluna, mas queremos t-la no primeiro lugar. Podemos clicar nela (1) e arrastar ao lugar entre Command Bar e Nome (2):
Falta adicionar o telefone da empresa na ltima coluna. Para isso selecionamos a Data Grid Row Pessoa (1), clicamos em Add (2) e Other Screen Data (3):
Atrs de Empresa digitamos um ponto (1), e o LightSwitch nos mostra automaticamente as propriedades da tabela Empresa. A nossa escolha "Telefone":
Depois de clicar em OK temos as quatro colunas do nosso grid, Empresa, Nome, Telefone e Telefone:
Temos duas colunas com o mesmo nome Telefone, uma vem da tabela Pessoa e a outra da tabela Empresa. Vamos deixar mais claro para o usurio da nossa aplicao qual qual. Selecionamos a coluna Telefone que acabamos de adicionar (1) e alteramos o Display Name para "Telefone Empresa" (2). Dica para controlar se alteramos o Telefone correto: podemos olhar para o campo Data Binding (3). A expresso PessoaSet(item).Empresa.Telefone significa O Telefone da Empresa da Pessoa.
Chegou a hora de mais um F5. Depois de selecionar a tela Editable Pessoa Set Grid podemos ver a lista exatamente do jeito que queremos:
Pr-requisitos
Para acompanhar este tutorial voc deve saber como
Criar uma nova soluo LightSwitch Adicionar uma tabela Adicionar uma relao entre tabelas Adicionar uma tela
1. Busca Padro
1.1 Criar nova Soluo
Para comear criamos uma nova soluo do tipo LightSwitch com nome "LSBR_Buscar". Alteramos a cultura do projeto para Portugus (Brasil).
"Id" do tipo Integer, no 'Display by Default' "Cdigo" do tipo String e obrigatrio "Nome" do tipo String e obrigatrio "CEP" do tipo Integer e obrigatrio
Dica: As telas do tipo "List and Details Screen" e "Search Data Screen" tambm incluem este campo de busca padro. Voc vai perceber que a busca ignora o campo CEP. Esta a grande limitao da busca padro do LightSwitch: restrito aos campos do tipo String. Mas Date, nmeros do tipo Integer e Double etc. ficam por fora.
2. Filtros
No prximo passo vamos incluir um campo para poder buscar clientes pelo CEP.
Escolhemos CEP:
E adicionamos um novo:
O Display Name da tela mudamos para "Clientes por CEP". Analisando a tela que LightSwitch criou automaticamente achamos um campo de busca para CEP:
Vamos testar esta busca por CEP que acabamos de criar. Executamos a aplicao, escolhemos a nova tela Clientes por CEP (1), digitamos no novo
campo de busca um dos CEPs que criamos anteriormente (2) e depois a tecla Enter, e nos grid aparece o cliente ou os clientes com este CEP (3):
Fcil demais.
LINQ
Escrevendo poucas linhas de cdigo usando LINQ d para implementar uma busca Full Text que busca no s nos campos do tipo String, mas em todos os campos e at em tabelas relacionadas. Isso vai ser explicado em um futuro tutorial.
Filter Extension
Uma forma bastante simples para implementar uma busca avanada a extenso oferecido pela Microsoft. Ainda Beta, mas d para usar e deve ser aperfeioado no futuro. Veja o tutorial neste blog.
Pr-requisitos
Para acompanhar este tutorial voc deve saber como
Criar uma nova soluo LightSwitch Adicionar uma tabela Adicionar uma relao entre tabelas Adicionar uma tela
"Id" do tipo Integer, no 'Display by Default' "Nome" do tipo String e obrigatrio "DataDeNascimento" do tipo Date e no obrigatrio
"Id" do tipo Integer, no 'Display by Default' "Data" do tipo Date e obrigatrio "Dentista" do tipo Dentista - relao One (Dentista) to Many (Consulta), On Delete Behaviour Restricted. "Paciente" do tipo Paciente - relao One (Paciente) to Many (Consulta), On Delete Behaviour Restricted. "Comentrio" do tipo String e no obrigatrio
Adicionamos um parmetro:
Agora precisamos explicar para o LightSwitch o que fazer com este parmetro. O lugar para incluir um pouco de cdigo no mtodo "PacientesFiltradas_PreprocessQuery". Vamos abr-lo clicando em Write Code:
LightSwitch abre automaticamente o arquivo ApplicationDataService.cs. Podemos ver que o mtodo recebe um String com nome TermoDeBuscaGeral (1), o mesmo que acabamos de criar, e todos os pacientes, empacotados na varivel query (2):
O resultado do nosso mtodo tambm a varivel query. Ou seja, recebemos a query, fazemos algo com ela (filtramos alguns dos pacientes dentro dela) e a devolvemos. Ao final o mtodo vai ser da seguinte forma: ? 1 partial void PacientesFiltradas_PreprocessQuery(string
TermoDeBuscaGeral, ref IQueryable<Paciente> query)
3 4 5 6 7 8 9 1 0 1 1
else query = from paciente in query where paciente.Nome.Contains(TermoDeBuscaGeral) DateTime data; if (DateTime.TryParse(TermoDeBuscaGeral, out data)) query = from paciente in query where paciente.DataDeNascimento == data || paciente.Consultas.Any(c => c.Data == data) select paciente;
1 c.Comentrio.Contains(TermoDeBuscaGeral)) 3 1 4} 1 5
select paciente;
|| paciente.Consultas.Any(c =>
Este tutorial no pretende ser uma introduo para LINQ, ento s vamos explicar os passos mais importantes: Primeiro o nosso mtodo tenta converter o termo de busca em uma data: ? 1data))
if (DateTime.TryParse(TermoDeBuscaGeral, out
...que tem a data de nascimento igual esta data: ? 1paciente.DataDeNascimento == data ...ou com pelo menos uma consulta naquela data:
? 1|| paciente.Consultas.Any(c => c.Data == data) Se no for uma data, selecionamos todos os pacientes cujo nome contm o termo de busca: ? 1paciente.Nome.Contains(TermoDeBuscaGeral) ...ou que tinham uma consulta com um dentista cujo nome contm o termo de busca: ? 1c.Dentista.Nome.Contains(TermoDeBuscaGeral)) ...ou que tinham uma consulta com o termo de busca dentro do comentrio: ? 1c.Comentrio.Contains(TermoDeBuscaGeral)) Pronto! Agora s falta criar a ltima tela para testar.
|| paciente.Consultas.Any(c => || paciente.Consultas.Any(c =>
Buscando por "Limpeza" achamos todos os pacientes que fizeram uma limpeza:
Buscando por "1/1/2011" achamos todos os pacientes que tiveram uma consulta ou que nasceram naquele dia:
Do jeito que est a tela ainda no faz muito sentido. Falta adicionar a lista de consultas do paciente e a possibilidade de adicionar uma nova consulta. rpido fazer isso. Criamos uma nova tela do tipo List and Details Screen, escolhemos Pacientes Filtradas na combo box Screen Data e adicionamos ambos Paciente Details e Paciente Consultas. Mudamos o Display Name para "Pacientes". Clicamos em Paciente Termo de Busca (1) e mudamos a Label Position para None:
Apagamos a tela EditablePacientesFiltradasGrid. Executamos a nossa aplicao novamente e buscamos por "Beth". O sistema acha um paciente que tive uma consulta com a Dra. Ana Elizabeth Fabrini, alm de uma paciente que se chama Beth:
Prerequisitos
Para acompanhar este tutorial voc deveria saber como
Criar uma nova soluo LightSwitch Adicionar uma Tabela Adicionar uma Tela
Resultado
Ao final vamos ter uma aplicao com a seguinte tela:
4. Adicionar Boto
Para adicionar um boto que adia a data de vencimento por uma semana abrimos a tela TarefaSetListDetail (provavelmente ainda est aberta). a Data Grid Row que define
o as colunas, e aqui onde queremos posicionar o nosso boto. Se queremos ter uma prpria coluna para o boto no podemos adicion-lo diretamente Data Grid Row. Precisamos empacot-lo en um grupo. Com o boto direito do mouse abrimos o menu de contexto do Data Grid Row (Tarefa) onde clicamos Add Group:
Antes de adicionar o boto ao grupo mudamos o nome do grupo que mostrado para o cliente para "Adiar". Na rvore marcamos o Group (1) e nas propriedades alteramos o nome (2):
LightSwitch abre uma janela onde podemos dar um nome ao que queremos executor quando algem clicar no boto. Digitamos "Adiar1Semana":
Para deixar o boto mais bonito alteramos o texto nele para "+1 semana":
Se algum clicasse no boto agora nada aconteceria - bvio, porque precisamos escrever o cdigo que manipula a data de vencimento da nossa tarefa. Para abrir o cdigo abrimos o menu de contexto do Adiar1Semana e escolhemos a opo Edit Execute Code:
Com apenas uma linha de cdigo conseguimos o que queremos: Adiar Escrevemo o seguinte cdigo no mtodo Adiar1Semana_Execute: ? 1partial void Adiar1Semana_Execute() { 2 TarefaSet.SelectedItem.DataDeVencimento = 3TarefaSet.SelectedItem.DataDeVencimento.AddDays(7); 4 } Claro, seria bom fazer o cdigo mais intelligente de forma que quando a data j vencida a nova data seria daqui a uma semana. Mas vamos deixar isso para l. Bom, s falta compilar e executar e testar o nosso boto:
Pr-requisitos
Para acompanhar este tutorial voc deveria saber como
Criar uma nova soluo LightSwitch Adicionar uma tabela Adicionar uma relao entre tabelas Adicionar uma tela
Resultado
Ao final vamos ter uma aplicao com a seguinte tela:
3. Ativar Extenso
A extenso instalada no Visual Studio, mas para usar precisamos ativ-la dentro da nossa soluo. Para isso abrimos as propriedades da nosso projeto LSBR_Filtrar-Dados com click direito (1) e selecionamos Propriedades (2):
Criamos uma tabela cujo nome "Cargo" (Plural Name: Cargos) e com dois campos:
"Id" do tipo Integer, no 'Display by Default' "Nome" do tipo String e obrigatrio "IsChefe" do tipo Boolean "DataNascimento" do tipo Date "Salario" (Display Name 'Salrio') do tipo String "Sexo" do tipo String e uma Choice List com dois tens: 'Masculino' e 'Feminino' "Cargo" do tipo Cargo
Em seguido precisamos manipular a query e escrever uma linha de cdigo dentro do mtodo PessoasFiltradas_PreprocessQuery:
Para deixar a tela mais arrumada ainda escondemos o label. Nas propriedades do controle Pessoa Termo Filtro escolhemos Label Position - None:
Pronto!
Se executarmos agora a nossa aplicao (F5) temos a seguinte tela (novo filtro destacado em vermelho):
Agora voc pode adicionar alguns dados nas tabelas Cargos e Pessoas e experimentar com diferentes filtros e grupos de filtros:
Cuidado, a extenso em verso beta ainda e tem alguns bugs, mas mesmo assim, bastante impressionante o que d para fazer com to pouco trabalho!