Skip to content

3. O estudo de caso

Desejamos desenvolver um aplicativo .NET que permita a um usuário realizar simulações de cálculo da remuneração das babás da associação “Maison de la petite enfance” de um município. Nos interessaremos tanto pela organização do código DotNet da aplicação quanto pelo código em si.

3.1. A base de dados “

Os dados estáticos necessários para elaborar a folha de pagamento estão armazenados em um banco de dados SQL Server Express denominado dbpam (pam = Pagamento de Cuidadoras Infantis). Esse banco de dados possui um administrador chamado sa, com a senha msde.

 

O banco de dados possui 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 previdência social do funcionário — chave primária
NOM
nome do funcionário
prenom
nome próprio
ADRESSE
seu endereço
VILLE
sua cidade
CODEPOSTAL
seu CEP
INDICE
seu índice de processamento — chave estrangeira no campo [INDICE] da tabela [INDEMNITES]

Seu conteúdo poderia ser o seguinte:

Image


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

Estrutura:

Seu conteúdo poderia ser o seguinte:

As alíquotas das contribuições sociais são independentes do empregado. A tabela anterior possui 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 plantão
ENTRETIENJOUR
subsídio de manutenção em euros por dia de plantão
REPASJOUR
Subsídio de alimentação em euros por dia de plantão
INDEMNITESCP
Subsídio de férias remuneradas. Trata-se de uma porcentagem a ser aplicada ao salário-base.

Seu conteúdo poderia ser o seguinte:

Image

Observe-se que os subsídios podem variar de uma babá para outra. Na verdade, eles estão associados a uma babá específica por meio do índice salarial dela. Assim, a Sra. Marie Jouveinal, que possui 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).

O banco de dados [dbpam] assim criado gera dois arquivos na pasta do SQL Server Express:

Os arquivos [dbpam.mdf, dbpam_log.ldf] podem ser transferidos para outro computador e reconectados ao SGBD SQL Server Express desse computador. Veja como proceder:

  • os arquivos BD e [dbpam] são duplicados em uma pasta
 
  • inicie o SQL Server Express
  • com o cliente SQL Server Management Studio Express, vincule o arquivo [dbpam.mdf] ao SGBD:
  1. clique com o botão direito do mouse em [Databases] / Anexar
  2. selecione o arquivo [dbpam.mdf] por meio de um botão [Add] não representado
  3. o arquivo anexado dará origem a um BD, que não deve existir ainda. Aqui, no campo [Attach As], atribuímos o nome [dbpam2] ao novo BD.
  4. Vemos o novo BD e suas tabelas

Essa técnica de vinculação de um BD é útil para transferir um BD de um cargo para outro, e vamos utilizá-la ocasionalmente aqui.

3.2. Modo de cálculo do salário de uma babá

Apresentamos agora a forma de cálculo do salário mensal de uma babá. Tomamos como exemplo o salário da Sra. Marie Jouveinal, que trabalhou 150 horas em 20 dias durante o mês a ser pago.

Os seguintes elementos são levados em consideração:

[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 babá é calculado pela seguinte fórmula:
[SALAIREBASE]=([TOTALHEURES]*
[BASEHEURE])*(1+
[INDEMNITESCP]/100)
[SALAIREBASE]=(150*[2.1])*(1+0.15)= 362,25
É necessário deduzir uma série de contribuições sociais desse salário-base:

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 babá tem direito, por cada dia trabalhado, a um auxílio de subsistência e a um auxílio-alimentação. A esse título, ela recebe os seguintes auxílios:

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

3.3. Lembretes ADO.NET

O aplicativo de cálculo de folha de pagamento necessita das informações do banco de dados [dbpam]. Sua arquitetura será a seguinte:

  • em [1], o usuário faz uma solicitação
  • em [2], o aplicativo de folha de pagamento processa a solicitação.
  • ela pode então precisar dos dados do banco de dados. Em seguida, ela faz uma consulta ao provedor (provider) ADO.NET do SGBD utilizado pelo [4].
  • Este consulta o banco de dados [5] e retorna os resultados ao provedor ADO.NET, que, por sua vez, os encaminha de volta ao aplicativo
  • esta aplica o resultados e elabora uma resposta [5] para o usuário

Apresentamos agora as principais interfaces oferecidas por um provedor ADO.NET aos seus clientes [3].

No modo conectado, o aplicativo:

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

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

  • IDbConnection, que encapsula as propriedades e métodos da conexã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 gerenciar a conexão com o banco de dados. Entre os métodos M e propriedades P dessa interface, encontram-se os seguintes:

Nome
Tipo
Função
ConnectionString
P
cadeia de conexão com o banco de dados. Ela especifica todos os parâmetros necessários para estabelecer a conexão com um banco de dados específico.
Open
M
abre a conexão com o banco de dados definido por ConnectionString
Close
M
encerra a conexão
BeginTransaction
M
inicia uma transação.
State
P
estado da conexão: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken

Se Connection for uma classe que implementa a interface IDbConnection, a conexão pode ser estabelecida da seguinte forma:

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

A interface IDbCommand

Serve para executar uma ordem SQL ou um procedimento armazenado. Entre os métodos M e propriedades P dessa interface, encontram-se os seguintes:

Nome
Tipo
Função
CommandType
P
indica o que deve ser executado — obtém seus valores de uma enumeração:
- CommandType.Text: executa a ordem SQL definida na propriedade CommandText. Esse é o valor padrão.
- CommandType.StoredProcedure: executa um procedimento armazenado no banco de dados
CommandText
P
- o texto da ordem SQL a ser executada se CommandType = CommandType.Text
- o nome da procedimento armazenado a ser executado se CommandType = CommandType.StoredProcedure
Connection
P
a conexão IDbConnection a ser utilizada 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 possui o parâmetro @id.
ExecuteReader
M
para executar uma ordem SQL Select. Obtém-se um objeto IDataReader que representa o resultado da ordem Select.
ExecuteNonQuery
M
para executar uma ordem SQL (Atualizar, Inserir, Excluir). Obtém-se o número de linhas afetadas pela operação (atualizadas, inseridas, excluídas).
ExecuteScalar
M
para executar uma instrução SQL Select que retorne apenas um único resultado, 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 ela é 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 conexã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();
...
// fechamento da conexã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 são processadas sequencialmente: primeiro a primeira linha, depois a segunda, ... Entre os métodos M e propriedades P dessa interface, encontram-se os seguintes:

Nome
Tipo
Função
FieldCount
P
o número de colunas da tabela IDataReader
GetName
M
GetName(i) retorna 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 próxima linha da tabela IDataReader. Retorna o valor booleano True se a leitura foi bem-sucedida; caso contrário, retorna False.
Close
M
fecha a tabela IDataReader.
GetBoolean
M
GetBoolean(i): retorna 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): retorna 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 costuma ser semelhante ao seguinte:

// abertura da conexã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
        ...
}
// fechar o leitor
reader.Close();
// encerramento da conexão
connexion.Close();