Skip to content

3. O estudo de caso

Pretendemos escrever uma aplicação .NET que permita a um utilizador realizar simulações de cálculo da remuneração das amas da associação «Maison de la petite enfance» de um município. Iremos centrar-nos tanto na organização do código DotNet da aplicação como no próprio código.

3.1. A base de dados « »

Os dados estáticos necessários para elaborar a folha de pagamento estão armazenados numa base de dados SQL Server Express denominada dbpam (pam = Paie Assistante Maternelle). Esta base de dados tem um administrador chamado «sa», cuja palavra-passe é «msde».

 

A base de dados tem três tabelas, EMPLOYES, COTISATIONS e INDEMNITES, cuja estrutura é a seguinte:


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

Estrutura:

SS
número de segurança social do colaborador - chave primária
NOM
nome do funcionário
prenom
o seu nome próprio
ADRESSE
a sua morada
VILLE
a sua cidade
CODEPOSTAL
o seu código postal
INDICE
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 das contribuições sociais 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é
INDICE
índice salarial - chave primária
BASEHEURE
preço líquido em euros por hora de serviço
ENTRETIENJOUR
subsídio de subsistência em euros por dia de serviço
REPASJOUR
Subsídio de refeição em euros por dia de serviço
INDEMNITESCP
Subsídio de férias pagas. Trata-se de uma percentagem a aplicar ao salário base.

O seu conteúdo poderia ser o seguinte:

Image

Note-se que os subsídios podem variar de uma ama a outra. Estão, de facto, associados a uma ama específica através do seu índice salarial. Assim, a Sra. Marie Jouveinal, que tem um índice salarial de 2 (tabela EMPLOYES), 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 EMPLOYES (INDICE) e a coluna INDEMNITES (INDICE).

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

Os ficheiros [dbpam.mdf, dbpam_log.ldf] podem ser transferidos para outro computador e voltados a associar ao SGBD SQL Server Express desse computador. Eis como proceder:

  • os ficheiros BD e [dbpam] são duplicados para uma pasta
 
  • inicia-se o SQL Server Express
  • com o cliente SQL Server Management Studio Express, associe o ficheiro [dbpam.mdf] ao SGBD:
  1. clique com o botão direito do rato em [Databases] / Anexar
  2. selecionar o ficheiro [dbpam.mdf] através de um botão [Add] não representado
  3. o ficheiro anexado dará origem a um BD que não deve já existir. Aqui, no campo [Attach As], atribuiu-se o nome [dbpam2] ao novo BD.
  4. Vê-se o novo BD e as suas tabelas

Esta técnica de anexar um BD é útil para transferir um BD de um posto 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. Tomamos como exemplo o salário da Sra. Marie Jouveinal, que trabalhou 150 horas ao longo de 20 dias durante o mês a pagar.

São tidos em conta os seguintes elementos:

[TOTALHEURES]: total des
 heures travaillées dans le
 mois

[TOTALJOURS]: total des jours
 travaillés dans le mois
[TOTALHEURES]=150
[TOTALJOURS]= 20
O salário base da ama é calculado através da seguinte fórmula:
[SALAIREBASE]=([TOTALHEURES]*
[BASEHEURE])*(1+
[INDEMNITESCP]/100)
[SALAIREBASE]=(150*[2.1])*(1+0.15)= 362,25
Deste salário base devem ser deduzidas várias contribuições sociais:

Contribution sociale
 généralisée et contribution
 au remboursement de la dette
 sociale : [SALAIREBASE]*[CSGRDS/100]

Contribution sociale
 généralisée déductible :
 [SALAIREBASE]*[CSGD/100]

Sécurité sociale, veuvage,
 vieillesse :
 [SALAIREBASE]*[SECU/100]
Retraite Complémentaire + 
AGPF + Assurance Chômage : 
[SALAIREBASE]*[RETRAITE/100]
CSGRDS : 12,64
CSGD : 22,28
Sécurité sociale : 34,02
Retraite : 28,55
Total das contribuições sociais:
[COTISATIONSSOCIALES]=[SALAIR
EBASE]*(CSGRDS+CSGD+SECU+RETR
[COTISATIONSSOCIALES]=97,48
Além disso, a ama tem direito, por cada dia trabalhado, a um subsídio de subsistência e a um subsídio de refeição. A este título, recebe os seguintes subsídios:

[Indemnités]=[TOTALJOURS]*(EN
TRETIENJOUR+REPASJOUR)
[INDEMNITES]=104
Em suma, o salário líquido a pagar à ama é o seguinte:
[SALAIREBASE]-
[COTISATIONSSOCIALES]+
[INDEMNITÉS]
[salaire NET]=368,77

3.3. Lembretes ADO.NET

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

  • em [1], o utilizador efetua um pedido
  • em [2], a aplicação de folha de pagamento processa-a.
  • esta pode então necessitar dos dados da base de dados. Em seguida, envia um pedido ao fornecedor (provider) ADO.NET do SGBD utilizado pelo [4].
  • Este consulta a base de dados [5] e devolve os resultados ao fornecedor ADO.NET, que, por sua vez, os transmite à aplicação
  • esta aplicaçãoprocura esses resultados e elabora uma resposta [5] para o utilizador

Recordamos agora as principais interfaces apresentadas por um fornecedor ADO.NET aos seus clientes [3].

No modo ligado, a aplicação:

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

Três interfaces ADO.NET estão principalmente envolvidas nestas 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 um comando SQL Select.

A interface IDbConnection

Serve 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 a ligação a uma base de dados específica.
Open
M
abre a ligação à base de dados definida por ConnectionString
Close
M
encerra a ligação
BeginTransaction
M
inicia uma transação.
State
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 abertura da ligação pode ser efetuada da seguinte forma:

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

A interface IDbCommand

Serve para executar um comando 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
indica o que deve ser executado - obtém os seus valores de uma enumeração:
- CommandType.Text: executa a ordem SQL definida na propriedade CommandText. Este é o valor por predefinição.
- CommandType.StoredProcedure: executa um procedimento armazenado na base de dados
CommandText
P
- o texto da ordem SQL a executar se CommandType = CommandType.Text
- o nome da procedimento armazenado a executar se CommandType = CommandType.StoredProcedure
Connection
P
a ligação IDbConnection a utilizar para executar a ordem SQL
Transaction
P
a transação IDbTransaction na qual executar a ordem SQL
Parameters
P
a lista de parâmetros de uma ordem SQL configurada. A ordem «update articles set price=price*1.1 where id=@id» tem o parâmetro @id.
ExecuteReader
M
para executar uma ordem SQL Select. Obtém-se um objeto IDataReader que representa o resultado do Select.
ExecuteNonQuery
M
para executar uma ordem SQL (Atualizar, Inserir, Eliminar). Obtém-se o número de linhas afetadas pela operação (atualizadas, inseridas, eliminadas).
ExecuteScalar
M
para executar uma ordem SQL Select que devolva apenas um único resultado, tal como em: select count(*) from articles.
CreateParameter
M
para criar os parâmetros IDbParameter de uma ordem SQL configurada.
Prepare
M
permite 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 ordem SQL sem transação terá a seguinte forma:

// abertura da sessão 
IDbConnection connexion=...
connexion.Open();
// preparação do comando
IDbCommand commande=new Command();
commande.Connection=connexion;
// execução da ordem select
commande.CommandText="select ...";
IDbDataReader reader=commande.ExecuteReader();
...
// execução da ordem update, insert, delete
commande.CommandText="insert ...";
int nbLignesInsérées=commande.ExecuteNonQuery();
...
// encerramento da ligação
connexion.Close();

A interface IDataReader

Serve para encapsular os resultados de uma ordem SQL Select. Um objeto IDataReader representa uma tabela com linhas e colunas, que é processada sequencialmente: primeiro a primeira linha, depois a segunda, ... 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 da tabela IDataReader
GetName
M
GetName(i) devolve o nome da coluna n.º i da tabela IDataReader.
Item
P
Item[i] representa a coluna n.º i da linha atual da tabela IDataReader.
Read
M
avança para a linha seguinte da tabela IDataReader. Devolve o valor booleano True se a leitura tiver sido bem-sucedida; caso contrário, devolve False.
Close
M
fecha a tabela IDataReader.
GetBoolean
M
GetBoolean(i): devolve o valor booleano da coluna n.º i da linha atual da tabela IDataReader. Os outros métodos análogos são os seguintes: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString.
Getvalue
M
Getvalue(i): devolve o valor da coluna n.º i da linha atual da tabela IDataReader como tipo object.
IsDBNull
M
IsDBNull(i) retorna True se a coluna n.º i da linha atual da tabela IDataReader não tiver valor, o que é simbolizado pelo valor SQL NULL.

A análise de um objeto IDataReader assemelha-se frequentemente ao seguinte:

// abertura da ligação 
IDbConnection connexion=...
connexion.Open();
// preparação do comando
IDbCommand commande=new Command();
commande.Connection=connexion;
// execução da ordem select
commande.CommandText="select ...";
IDataReader reader=commande.ExecuteReader();
// análise dos resultados
while(reader.Read()){
     // processar linha atual
        ...
}
// encerramento do leitor
reader.Close();
// encerramento da ligação
connexion.Close();