Skip to content

3. O Estudo de Caso

Pretendemos desenvolver uma aplicação .NET que permita ao utilizador simular cálculos de folhas de pagamento para prestadores de cuidados infantis na associação «Maison de la petite enfance» de um município. Iremos centrar-nos tanto na organização do código .NET da aplicação como no próprio código.

3.1. A base de dados

Os dados estáticos necessários para gerar o recibo de vencimento estão armazenados numa base de dados SQL Server Express denominada dbpam (pam = Paie Assistante Maternelle). Esta base de dados tem um administrador denominado sa com a palavra-passe msde.

 

A base de dados tem três tabelas, EMPLOYEES, CONTRIBUTIONS e ALLOWANCES, com a seguinte estrutura:


Table EMPLOYES : rassemble des informations sur les différentes assistantes maternelles

Estrutura:

SS
número de segurança social do funcionário - chave primária
NOME
apelido do funcionário
nome próprio
nome
ENDEREÇO
a morada deles
CIDADE
a cidade dele/dela
CÓDIGO POSTAL
o seu código postal
ÍNDICE
o seu índice de processamento - chave estrangeira no campo [INDICE] da tabela [INDEMNITES]

O seu conteúdo poderia ser o seguinte:

Image


Table COTISATIONS : rassemble les taux des cotisations sociales prélevées sur le salaire

Estrutura:

O seu conteúdo poderia ser o seguinte:

As taxas de contribuição para a segurança social são independentes do trabalhador. A tabela anterior tem apenas uma linha.


Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
ÍNDICE
índice salarial - chave primária
HORA BASE
taxa horária líquida em euros
MANUTENÇÃO DIÁRIA
subsídio diário em euros por dia de serviço de permanência
REFEIÇÕES POR DIA
Subsídio de refeição em euros por dia de prestação de cuidados
SUBSÍDIO DE FÉRIAS
Subsídio de férias pagas. Trata-se de uma percentagem aplicada ao salário base.

O seu conteúdo poderia ser o seguinte:

Image

Note-se que os subsídios podem variar de um prestador de cuidados infantis para outro. Estão associados a um prestador de cuidados infantis específico através da tabela salarial desse prestador. Assim, a Sra. Marie Jouveinal, que tem uma tabela salarial de 2 (tabela EMPLOYEES), tem um salário por hora de 2,1 euros (tabela INDEMNITES).

As relações entre as três tabelas são as seguintes:

Existe uma relação de chave estrangeira entre a coluna EMPLOYEES(INDEX) e a coluna ALLOWANCES(INDEX).

A base de dados [dbpam] criada desta forma gera dois ficheiros na pasta do SQL Server Express:

Os ficheiros [dbpam.mdf, dbpam_log.ldf] podem ser transferidos para outro computador e ligados novamente ao sistema de gestão de bases de dados SQL Server Express desse computador. Veja como fazê-lo:

  • Os ficheiros da base de dados [dbpam] são copiados para uma pasta
 
  • Inicie o SQL Server Express
  • Utilizando o cliente SQL Server Management Studio Express, anexe o ficheiro [dbpam.mdf] à base de dados:
  1. Clique com o botão direito do rato em [Bases de dados] / Anexar
  2. Selecione o ficheiro [dbpam.mdf] utilizando o botão [Adicionar] (não mostrado)
  3. O ficheiro anexado irá criar uma base de dados que ainda não deve existir. Aqui, no campo [Anexar como], nomeámos a nova base de dados [dbpam2].
  4. Pode ver a nova base de dados e as suas tabelas

Esta técnica para anexar uma base de dados é útil para transferir uma base de dados de um computador para outro, e iremos utilizá-la ocasionalmente aqui.

3.2. Método de cálculo do salário de uma ama

Apresentamos agora o método de cálculo do salário mensal de uma ama. Como exemplo, utilizaremos o salário da Sra. Marie Jouveinal, que trabalhou 150 horas ao longo de 20 dias durante o período de pagamento.

São tidos em conta os seguintes fatores:

[TOTALHOURS]: total
 horas trabalhadas no
 mês

[TOTALDAYS]: total de dias
 trabalhados no mês
[TOTALHOURS]=150
[TOTALDAYS] = 20
O salário base do prestador de cuidados infantis é calculado utilizando a seguinte fórmula:
[SALÁRIO BASE]=([TOTAL DE HORAS]*
[TARIFA POR HORA])*(1+
[CPALLOWANCE]/100)
[SALÁRIO BÁSICO]=(150*[2,1])*(1+0,15)= 362,25
É necessário deduzir várias contribuições para a segurança social deste salário base:

Contribuição social geral
 e dívida
 para o reembolso da dívida
 : [SALÁRIO BASE]*[CSGRDS/100]

Dedução
 dedutível:
 [SALÁRIO BÁSICO]*[CSGD/100]

Segurança Social, Viúvas,
 velhice:
 [SALÁRIO BASE]*[SECU/100]
Pensão Complementar +
AGPF + Seguro de Desemprego:
[SALÁRIO BASE]*[PENSÃO/100]
CSGRDS: 12,64
CSGD: 22,28
Segurança Social: 34,02
Pensão: 28,55
Total das contribuições para a segurança social:

[CONTRIBUIÇÕES SOCIAIS] = [SALÁRIO
EBASE]*(CSGRDS+CSGD+SECU+RETR
[CONTRIBUIÇÕES SOCIAIS]=97,48
Além disso, a prestadora de cuidados infantis tem direito a um subsídio de subsistência e a um subsídio de refeição por cada dia trabalhado. Como tal, recebe os seguintes subsídios:
[Remuneração] = [TOTAL_DIAS] * (EN
SUBSÍDIO DIÁRIO + SUBSÍDIO DIÁRIO DE REFEIÇÕES)
[SUBSÍDIOS]=104
No final, o salário líquido a pagar à ama é o seguinte:
[SALÁRIO BASE]-
[CONTRIBUIÇÕES PARA A SEGURANÇA SOCIAL]+
[SUBSÍDIOS]
[SALÁRIO LÍQUIDO]=368,77

3.3. Lembretes sobre o ADO.NET

A aplicação de cálculo de salários requer informações da base de dados [dbpam]. A sua arquitetura será a seguinte:

  • Em [1], o utilizador faz um pedido
  • Em [2], a aplicação de folha de pagamento processa-a.
  • Pode então necessitar de dados da base de dados. Em seguida, envia uma consulta ao fornecedor ADO.NET do SGBD que está a ser utilizado [4].
  • O provedor acede à base de dados [5] e devolve os resultados ao provedor ADO.NET, que, por sua vez, os transmite de volta à aplicação
  • A aplicação processa estes resultados e gera uma resposta [5] para o utilizador

Vamos agora analisar as principais interfaces fornecidas por um fornecedor ADO.NET aos seus clientes [3].

No modo conectado, a aplicação:

  1. abre uma ligação à fonte de dados
  2. trabalha com a fonte de dados no modo de leitura/gravação
  3. encerra a ligação

Três interfaces ADO.NET estão principalmente envolvidas nessas operações:

  • IDbConnection, que encapsula as propriedades e métodos da ligação.
  • IDbCommand, que encapsula as propriedades e métodos do comando SQL executado.
  • IDataReader, que encapsula as propriedades e métodos do resultado de uma instrução SQL SELECT.

A interface IDbConnection

é utilizada para gerir a ligação à base de dados. Entre os métodos (M) e propriedades (P) desta interface encontram-se os seguintes:

Nome
Tipo
Função
ConnectionString
P
Cadeia de ligação à base de dados. Especifica todos os parâmetros necessários para estabelecer uma ligação com uma base de dados específica.
Abrir
M
Abre a ligação à base de dados definida por ConnectionString
Fechar
M
Encerra a ligação
IniciarTransação
M
inicia uma transação.
Estado
P
Estado da ligação: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken

Se Connection for uma classe que implementa a interface IDbConnection, a ligação pode ser aberta da seguinte forma:

1
2
3
IDbConnection connexion=new Connection();
connexion.ConnectionString=...;
connexion.Open();

A interface IDbCommand

é utilizada para executar uma instrução SQL ou um procedimento armazenado. Entre os métodos M e propriedades P desta interface encontram-se os seguintes:

Nome
Tipo
Função
CommandType
P
especifica o que executar - obtém os seus valores de uma enumeração:
- CommandType.Text: executa a instrução SQL definida na propriedade CommandText. Este é o valor predefinido.
- CommandType.StoredProcedure: executa um procedimento armazenado na base de dados
CommandText
P
- o texto da instrução SQL a executar se CommandType= CommandType.Text
- o nome da procedimento armazenado a executar se CommandType= CommandType.StoredProcedure
Conexão
P
a ligação IDbConnection a utilizar para executar a instrução SQL
Transação
P
a transação IDbTransaction na qual a instrução SQL deve ser executada
Parâmetros
P
A lista de parâmetros para uma instrução SQL parametrizada. A instrução `update articles set price=price*1.1 where id=@id` tem o parâmetro `@id`.
ExecuteReader
M
Para executar uma instrução SQL SELECT. Isto devolve um objeto IDataReader que representa o resultado da instrução SELECT.
ExecuteNonQuery
M
para executar uma instrução SQL Update, Insert ou Delete. É devolvido o número de linhas afetadas pela operação (atualizadas, inseridas ou eliminadas).
ExecuteScalar
M
para executar uma instrução SQL Select que retorna um único resultado, como: select count(*) from articles.
CreateParameter
M
para criar os parâmetros IDbParameter de uma instrução SQL parametrizada.
Prepare
M
permite-lhe otimizar a execução de uma consulta parametrizada quando esta é executada várias vezes com parâmetros diferentes.

Se Command for uma classe que implementa a interface IDbCommand, a execução de uma instrução SQL sem uma transação assumirá a seguinte forma:

// ouverture connexion 
IDbConnection connexion=...
connexion.Open();
// préparation commande
IDbCommand commande=new Command();
commande.Connection=connexion;
// exécution ordre select
commande.CommandText="select ...";
IDbDataReader reader=commande.ExecuteReader();
...
// exécution ordre update, insert, delete
commande.CommandText="insert ...";
int nbLignesInsérées=commande.ExecuteNonQuery();
...
// fermeture connexion
connexion.Close();

A interface IDataReader

Utilizada para encapsular os resultados de uma instrução SQL Select. Um objeto IDataReader representa uma tabela com linhas e colunas, que são processadas sequencialmente: primeiro a primeira linha, depois a segunda e assim por diante. Entre os métodos (M) e propriedades (P) desta interface encontram-se os seguintes:

Nome
Tipo
Função
FieldCount
P
O número de colunas na tabela IDataReader
GetName
M
GetName(i) devolve o nome da coluna i na tabela do IDataReader.
Item
P
Item[i] representa a coluna número i da linha atual na tabela IDataReader.
Ler
M
Passa para a linha seguinte na tabela IDataReader. Devolve True se a linha tiver sido lida com sucesso, False caso contrário.
Fechar
M
Fecha a tabela IDataReader.
GetBoolean
M
GetBoolean(i): devolve o valor booleano da coluna i na linha atual da tabela IDataReader. Outros métodos semelhantes incluem: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): devolve o valor da coluna i na linha atual da tabela IDataReader como um tipo de objeto.
IsDBNull
M
IsDBNull(i) retorna True se a coluna i da linha atual na tabela IDataReader não tiver valor, o que é representado pelo valor SQL NULL.

A utilização de um objeto IDataReader é frequentemente semelhante ao seguinte:

// ouverture connexion 
IDbConnection connexion=...
connexion.Open();
// préparation commande
IDbCommand commande=new Command();
commande.Connection=connexion;
// exécution ordre select
commande.CommandText="select ...";
IDataReader reader=commande.ExecuteReader();
// exploitation résultats
while(reader.Read()){
    // exploiter ligne courante
        ...
}
// fermeture reader
reader.Close();
// fermeture connexion
connexion.Close();