Deck of Cards |
---|
| Card |
---|
| Evitar chamadas "burras" ao server. Ao executar o ReadRecord é feita uma consulta que não vai retornar nada porque as chaves estão null e se existir campos complementares a lib vai executar uma consulta no banco que também não irá retornar nada. Bloco de código |
---|
| //Criação do DataServer
IEduDataServer serverFilter = (IEduDataServer)RMSBroker.CreateLocalObject(dataServerUserFilterTable);
//Chamada burra somente para que seja setado o contexto no DataServer
serverFilter.ReadRecord(Context, null, null); |
No caso acima é possível passar para o dataserver o contexto sem executar o ReadRecord, pois o método GetUsrFilter é um método do EduDataServer que estende de RMSDataServer. Bloco de código |
---|
| using (IEduDataServer serverFilter = RMSBroker.CreateServer<IEduDataServer>(dataServerUserFilterTable))
userFilters = userFilters.Append(serverFilter != null ? serverFilter.GetUsrFilter(Context) : string.Empty); |
Bloco de código |
---|
| public string GetUsrFilter(RMSContext contexto)
{
if (this.DBS == null)
this.InitServer();
if(contexto != null)
this.Context = contexto; |
|
Card |
---|
| Evitar chamadas desnecessárias de ReadRecord, se deseja apenas trazer apenas alguns campos. Ao executar o ReadRecord é feita uma consulta que ir retornar um dataset completo com vários campos que nem serão utilizados, além de trazer os campos complementares do mesmo no dataset. Os campos que necessito são CODCURSO, CODHABILITACAO e CODGRADE, então não se dá a necessidade de executar um ReadRecord para tal fim.
Bloco de código |
---|
| IEduDataServer dtServer = RMSBroker.CreateServer<IEduDataServer>("EduHabilitacaoFilialData");
DataSet ds = dtServer.ReadRecord(RMSSession.Context, new object[] { base.CodColigada, idHabFilial }, null);
if ((ds != null) && (ds.Tables.Count > 0) && (ds.Tables[0].Rows.Count > 0))
this.SetHabilitacaoFilial(
ds.Tables[0].Rows[0]["CODCURSO"].ToString(),
ds.Tables[0].Rows[0]["CODHABILITACAO"].ToString(),
ds.Tables[0].Rows[0]["CODGRADE"].ToString(),
idHabFilial); |
No caso acima ao invés de executar o um ReadRecord, executo um consulta simples trazendo apenas os campos que necessito conforme abaixo. Bloco de código |
---|
| using (IEduHabilitacaoFilial habFilial = (IEduHabilitacaoFilial)RMSBroker.CreateRemoteObject(
typeof(IEduHabilitacaoFilial), "EduHabilitacaoFilialData"))
{
EduHabilitacaoFilialItem habFilialItem = habFilial.GetHabilitacaoFilial(codColigada, idHabilitacaoFilial);
if (!string.IsNullOrEmpty(habFilialItem.CodCurso)
&& !string.IsNullOrEmpty(habFilialItem.CodHabilitacao) && !string.IsNullOrEmpty(habFilialItem.CodGrade))
this.SetHabilitacaoFilial(habFilialItem.CodCurso, habFilialItem.CodHabilitacao,
habFilialItem.CodGrade, idHabilitacaoFilial); |
Bloco de código |
---|
| public EduHabilitacaoFilialItem GetHabilitacaoFilial(int codColigada, int idHabilitacaoFilial)
{
EduHabilitacaoFilialItem habilitacaoFilial = new EduHabilitacaoFilialItem();
if (this.DBS == null)
this.InitServer();
DataTable dtHabFilial = this.DBS.QuerySelect(EduHabilitacaoFilialProps.SHabilitacaoFilial,
@"SELECT SHABILITACAOFILIAL.CODCURSO,
SHABILITACAOFILIAL.CODHABILITACAO,
SHABILITACAOFILIAL.CODGRADE
FROM SHABILITACAOFILIAL (NOLOCK)
WHERE SHABILITACAOFILIAL.CODCOLIGADA = :CODCOLIGADA_N
AND SHABILITACAOFILIAL.IDHABILITACAOFILIAL = :IDHABILITACAOFILIAL_N /*AND*/", codColigada, idHabilitacaoFilial);
SetHabilitacaoFilialItem(codColigada, idHabilitacaoFilial, habilitacaoFilial, dtHabFilial);
return habilitacaoFilial;
} |
|
Card |
---|
| Sempre observar a ordem das chaves para fazer um join, ao colocar na ordem correta se torna mais performática a consulta. Abaixo temos um join com chaves fora da ordem no banco de dados. Bloco de código |
---|
| JOIN SGRADE (NOLOCK)
ON SGRADE.CODGRADE = SHABILITACAOFILIAL.CODGRADE
AND SGRADE.CODCOLIGADA = SHABILITACAO.CODCOLIGADA
AND SGRADE.CODCURSO = SHABILITACAO.CODCURSO
AND SGRADE.CODHABILITACAO = SHABILITACAO.CODHABILITACAO |
Abaixo temos o mesmo join com a ordem correta do banco. Bloco de código |
---|
| JOIN SGRADE (NOLOCK)
ON SGRADE.CODCOLIGADA = SHABILITACAOFILIAL.CODCOLIGADA
AND SGRADE.CODCURSO = SHABILITACAOFILIAL.CODCURSO
AND SGRADE.CODHABILITACAO = SHABILITACAOFILIAL.CODHABILITACAO
AND SGRADE.CODGRADE = SHABILITACAOFILIAL.CODGRADE |
Ordem das chaves no banco. ![](/download/attachments/362457676/image2018-5-21_11-30-56.png?version=1&modificationDate=1526913057000&api=v2)
|
Card |
---|
| Sempre informar o tipo do campo no filtro da sua consulta. Abaixo temos um exemplo de filtro sem o tipo. A importância deste tipo é fazer com que a lib não procure que tipo (string, número, data e etc.) é aquele campo do filtro. Bloco de código |
---|
| WHERE SMATRICPL.CODCOLIGADA = :CODCOLIGADA
AND SMATRICPL.IDPERLET = :IDPERLET
AND SMATRICPL.IDHABILITACAOFILIAL = :IDHABILITACAOFILIAL
AND SMATRICPL.RA = :RA |
Abaixo temos o filtro com o tipo dos campos. Bloco de código |
---|
| WHERE SMATRICPL.CODCOLIGADA = :CODCOLIGADA_N
AND SMATRICPL.IDPERLET = :IDPERLET_N
AND SMATRICPL.IDHABILITACAOFILIAL = :IDHABILITACAOFILIAL_N
AND SMATRICPL.RA = :RA_S |
Tipos disponíveis: - _D: DateTime;
- _V: Float;
- _N: Int;
- _S: String;
- _H: Short.
|
Card |
---|
| Sempre que utilizar o cache de parâmetro no lado client Client, o carregamento da classe de parâmetros é muito custoso. Abaixo temos um exemplo de sempre que chamar o EduParametros é feito o carregamento do mesmo. Bloco de código |
---|
| private EduParams EduParametros
{
get
{
_params = new EduParams(RMSSession.Context.CodColigada, RMSSession.Context.CodFilial, RMSSession.Context.CodTipoCurso);
return _params;
}
} |
Segue abaixo a utilização de cache de parâmetros. Bloco de código |
---|
| private EduParams EduParametros
{
get
{
if (_params == null)
_params = new EduParams(RMSSession.Context.CodColigada, RMSSession.Context.CodFilial, RMSSession.Context.CodTipoCurso);
return _params;
}
}
private EduParams _params = null; |
|
Card |
---|
| Evite utilizar os serviços abaixo para atualização de informações em lote, pois os mesmo geram muito IO no banco.
Bloco de código |
---|
| EduDatasetUtils.EditaRegistro<EduLancamentoParcelaDescPontualItem>
("SLANDESCPONTUAL", descontoPontual, campos, valoresPK, this.DBS, codUsuario, out registroExiste, out pk);
EduDatasetUtils.ExcluiRegistro<EduLancamentoParcelaDescPontualItem>
("SLANDESCPONTUAL", campos, valores, this.DBS, codUsuario);
EduDatasetUtils.InsereRegistro<EduLancamentoParcelaDescPontualItem>
("SLANDESCPONTUAL", descontoPontual, this.DBS, codUsuario); |
|
|
|