Executando tarefas relacionadas a dados usando código
Você pode usar os designers e as janelas de ferramenta no Visual Studio LightSwitch para realizar muitas tarefas de design relacionadas a dados. No entanto, determinadas tarefas só podem ser realizadas adicionando-se código a um aplicativo. Por exemplo, para validar um campo aplicando condições personalizadas, você deve gravar o código. Este documento mostra como realizar tarefas relacionadas a dados usando o modelo de objeto de tempo de execução de dados. Para obter mais informações sobre onde você pode gravar código em um aplicativo, consulte os seguintes tópicos:
Tarefas comuns
A lista a seguir mostra tarefas relacionadas a dados comuns que você pode realizar usando o modelo de objeto de tempo de execução de dados. As tarefas serão descritas posteriormente neste documento.
Ler dados
Atualizando dados
Excluindo dados
Adicionando dados
Salvando dados
Validando dados
Definindo permissões em dados
Trabalhando com conjuntos de alterações
Estendendo consultas
Ler dados
Você pode ler itens de dados individuais ou coleções de itens de dados de qualquer fonte de dados em seu aplicativo.
O exemplo a seguir recupera o cliente que está atualmente selecionado em uma tela.
Private Sub RetrieveCustomer_Execute()
Dim cust As Customer = Me.Customers.SelectedItem
If cust.ContactName = "Bob" Then
'Perform some task on the customer entity.
End If
End Sub
partial void RetrieveCustomer_Execute()
{
Customer cust = this.Customers.SelectedItem;
if (cust.ContactName == "Bob")
{
//Perform some task on the customer entity.
}
}
O exemplo a seguir itera em uma coleção de clientes.
Private Sub RetrieveCustomers_Execute()
For Each cust As Customer In Me.DataWorkspace.NorthwindData.Customers
If cust.ContactName = "Bob" Then
'Perform some task on the customer entity.
End If
Next
End Sub
partial void RetrieveCustomers_Execute()
{
foreach (Customer cust in this.DataWorkspace.NorthwindData.Customers)
{
if (cust.ContactName == "Bob")
{
//Perform some task on the customer entity.
}
}
}
Navegando em relações de dados
Você pode ler dados de entidades relacionadas. Por exemplo, uma entidade Cliente pode ter uma relação de um para muitos com uma entidade Pedidos. Você pode iterar em todos os pedidos que foram feitos por um cliente usando a propriedade Pedidos da entidade Cliente.
O exemplo a seguir itera na coleção de pedidos relacionados a um cliente.
Private Sub RetrieveSalesOrders_Execute()
Dim cust As Customer = Me.Customers.SelectedItem
For Each myOrder As Order In cust.Orders
If myOrder.OrderDate = Today Then
'Perform some task on the order entity.
End If
Next
End Sub
partial void RetrieveSalesOrders_Execute()
{
Customer cust = this.Customers.SelectedItem;
foreach (Order order in cust.Orders)
{
if (order.OrderDate == DateTime.Today)
{
//perform some task on the order entity.
}
}
}
O exemplo a seguir obtém o cliente que fez um pedido específico.
Private Sub RetrieveCustomer_Execute()
Dim order As Order
order = Me.DataWorkspace.NorthwindData.Orders_Single _
(Orders.SelectedItem.OrderID)
Dim cust As Customer
cust = order.Customer
'Perform some task on the order entity.
End Sub
partial void RetrieveCustomer_Execute()
{
Order order = this.DataWorkspace.NorthwindData.Orders_Single
(Orders.SelectedItem.OrderID);
Customer cust = order.Customer;
//Perform some task on the customer entity.
}
Lendo dados com a execução de uma consulta
Você pode recuperar consultas do modelo e executá-las no seu código. Para exibir um exemplo, consulte Como recuperar dados a partir de uma consulta usando código.
Atualizando dados
Você pode atualizar dados para qualquer entidade usando código. O exemplo a seguir mostra código executado quando um usuário cria um pedido na entidade Pedido em uma tela e clica no botão Salvar. O código atualiza um campo na entidade Produtos usando um campo na entidade Detalhes do Pedido.
Private Sub Orders_Inserting(entity As Order)
For Each detail In entity.Order_Details
detail.Product.UnitsInStock =
detail.Product.UnitsInStock - detail.Quantity
Next
End Sub
partial void Orders_Inserting(Order entity)
{
foreach (Order_Detail detail in entity.Order_Details)
{
detail.Product.UnitsInStock =
(short?)(detail.Product.UnitsInStock - detail.Quantity);
}
}
Dica
Se o código modificar dados de outras fontes de dados, você deverá confirmar essas alterações chamando o método SaveChanges dessa fonte de dados.
Excluindo dados
Você pode excluir dados chamando o método Delete de qualquer entidade. O exemplo a seguir exclui um cliente da fonte de dados NorthwindData.
Private Sub DeleteCustomer_Execute()
Dim cust As Customer
cust = Me.Customers.SelectedItem
If Customers.CanDelete Then
cust.Delete()
End If
End Sub
partial void DeleteCustomer_Execute()
{
Customer cust =
this.Customers.SelectedItem;
if (Customers.CanDelete)
{
cust.Delete();
}
}
Adicionando dados
O exemplo a seguir adiciona um novo cliente à fonte de dados NorthwindData. Este exemplo popula os campos que descrevem o novo cliente usando informações de um contato recém-adicionado a uma lista do SharePoint. O exemplo chama uma consulta chamada NewCustomersInSharePoint para determinar quais contatos na lista do SharePoint ainda não foram importados para a fonte de dados NorthwindData.
Private Sub ImportCustomers_Execute()
For Each spCust As SharePointCustomer In _
Me.DataWorkspace.SharePointData.NewCustomersInSharePoint
Dim newCust As Customer = New Customer()
With newCust
.ContactName = spCust.FirstName & " " & spCust.LastName
.Address = spCust.Address
.City = spCust.City
.PostalCode = spCust.PostalCode
.Region = spCust.Region
'Set the CopiedToDatabase field of the item in SharePoint.
spCust.CopiedToDatabase = "Yes"
End With
Next
Me.DataWorkspace.SharePointData.SaveChanges()
End Sub
partial void ImportCustomers_Execute()
{
foreach (SharePointCustomer spCust in
this.DataWorkspace.SharePointData.NewCustomersInSharePoint())
{
Customer newCust = new Customer();
newCust.ContactName = spCust.FirstName + " " + spCust.LastName;
newCust.Address = spCust.Address;
newCust.City = spCust.City;
newCust.PostalCode = spCust.PostalCode;
newCust.Region = spCust.Region;
//Set the CopiedToDatabase field of the item in SharePoint.
spCust.CopiedToDatabase = "Yes";
}
this.DataWorkspace.SharePointData.SaveChanges();
}
Salvando dados
Normalmente, as alterações pendentes são confirmadas em uma fonte de dados quando o usuário clica no botão Salvar em uma tela. No entanto, você também pode confirmar alterações pendentes adicionando um código que chame o método SaveChanges de uma fonte de dados. Você deverá adicionar esse código se quiser realizar uma destas tarefas:
Confirme alterações feitas nos dados localizados em outras fontes de dados.
Substitua o evento Save de uma tela.
Confirmando alterações feitas por você nos dados localizados em outras fontes de dados
Os arquivos em que você grava o código personalizado têm uma fonte de dados primária. Se adicionar o código personalizado que modifica dados de outra fonte de dados à solução LightSwitch, você deverá confirmar essas alterações chamando o método SaveChanges dessa fonte de dados.
O exemplo a seguir mostra código executado quando um usuário cria um pedido em uma entidade Pedido em uma tela e clica no botão Salvar. O código atualiza um campo na entidade Produtos usando um campo na entidade Detalhes do Pedido. Como a entidade Produtos está em outra fonte de dados, esse código chama o método SaveChanges dessa fonte de dados para confirmar as alterações.
Private Sub Orders_Inserting(entity As Order1)
For Each detail In entity.Order_Details
detail.Product.UnitsInStock = detail.Product.UnitsInStock - detail.Quantity
Next
Me.DataWorkspace.ProductDataSource.SaveChanges()
End Sub
partial void Orders_Inserting(Order1 entity)
{
foreach (Order_Detail1 detail in entity.Order_Details)
{
detail.Product.UnitsInStock = (short?)
(detail.Product.UnitsInStock - detail.Quantity);
}
this.DataWorkspace.ProductDataSource.SaveChanges();
}
Substituindo o evento Salvar de uma tela
Você pode alterar o comportamento do botão Salvar em uma tela substituindo o evento Save. Como você está substituindo o comportamento do botão Salvar, seu código deve chamar o método SaveChanges quando você quiser confirmar as alterações pendentes.
O exemplo a seguir substitui o evento Save de uma tela do cliente para capturar e identificar uma exceção específica que poderá ser acionada se a operação de gravação falhar.
Private Sub CustomersListDetail_Saving(ByRef handled As Boolean)
Try
Me.DataWorkspace.SharePointData.SaveChanges()
Catch ex As DataServiceOperationException
If ex.ErrorInfo = "DTSException" Then
Me.ShowMessageBox(ex.Message)
Else
Throw ex
End If
End Try
handled = True
End Sub
partial void CustomersListDetail_Saving(ref bool handled)
{
try
{
this.DataWorkspace.SharePointData.SaveChanges();
}
catch (DataServiceOperationException ex)
{
if (ex.ErrorInfo == "DTSException")
{
this.ShowMessageBox(ex.Message);
}
else
{
throw ex;
}
}
handled = true;
}
Validando dados
Você pode aplicar regras de validação personalizada aos campos de uma entidade. Você pode adicionar mensagens de erro personalizadas que aparecem quando usuários modificam o valor de propriedades de maneiras que não estejam de acordo com as regras de validação. Para obter mais informações, consulte Como validar dados em um aplicativo LightSwitch
Definindo permissões em dados
Por padrão, todos os usuários podem exibir, inserir, excluir ou atualizar dados que aparecem em uma tela. No entanto, você pode restringir essas permissões adicionando código a um dos seguintes métodos:
CanRead
CanInsert
CanDelete
CanUpdate
Se você restringir uma operação usando esses métodos, o LightSwitch tornará a operação indisponível para os usuários que não tenham permissões irrestritas. Para obter mais informações, consulte Como tratar eventos de dados.
O exemplo a seguir permite que um usuário atualize informações de cliente se tiver permissão de atualização. Esse exemplo de código exige um grupo de permissões chamado RoleUpdate. Para obter mais informações sobre como adicionar um grupo de permissões a seu aplicativo, consulte Habilitando autorização e criando permissões no LightSwitch.
Private Sub Customers_CanUpdate(ByRef result As Boolean)
result = Me.Application.User.HasPermission(Permissions.RoleUpdate)
End Sub
partial void Customers_CanUpdate(ref bool result)
{
result = this.Application.User.HasPermission(Permissions.RoleUpdate);
}
Por padrão, LightSwitch chama esses métodos quando um usuário tenta exibir, inserir, excluir ou atualizar informações. Você também pode chamar esses métodos no seu código personalizado antes que os dados sejam lidos ou modificados.
Trabalhando com conjuntos de alterações
Você pode identificar e descartar alterações pendentes antes que elas sejam confirmadas em uma fonte de dados. O exemplo a seguir mostra três métodos de usuário que identificam e descartam alterações pendentes. O método UndoAllCustomerUpdates descarta todas as alterações feitas em todos os clientes. O método UndoAllUpdates descarta todas as alterações feitas na fonte de dados. O método UndoCustomerEdit descarta alterações feitas na linha de dados selecionada no momento em uma tela do cliente.
Private Sub UndoAllCustomerUpdates_Execute()
For Each Cust As Customer In _
Me.DataWorkspace.NorthwindData.Details. _
GetChanges().OfType(Of Customer)()
Cust.Details.DiscardChanges()
Next
End Sub
Private Sub UndoAllUpdates_Execute()
Me.DataWorkspace.NorthwindData.Details.DiscardChanges()
End Sub
Private Sub UnduCustomerEdit_Execute()
Customers.SelectedItem.Details.DiscardChanges()
End Sub
partial void UndoAllCustomerUpdates_Execute()
{
foreach (Customer cust in
this.DataWorkspace.NorthwindData.Details.
GetChanges().OfType<Customer>())
{
cust.Details.DiscardChanges();
}
}
partial void UndoAllUpdates_Execute()
{
this.DataWorkspace.NorthwindData.Details.DiscardChanges();
}
partial void UndoCustomerEdit_Execute()
{
Customers.SelectedItem.Details.DiscardChanges();
}
Estendendo consultas modeladas
Se quiser modificar uma consulta além dos recursos do Designer de Consulta, você poderá estender a consulta adicionando código ao método PreProcessQuery da consulta. Para obter mais informações, consulte Como estender uma consulta usando código.