Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Informações
iconfalse
Deck of Cards
iddicas
Card
iddica1
labelDica 1

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.Image Removed

Bloco de código
languagec#
//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.

Image Removed

Image Removed
Bloco de código
languagec#
using (IEduDataServer serverFilter = RMSBroker.CreateServer<IEduDataServer>(dataServerUserFilterTable))
  userFilters = userFilters.Append(serverFilter != null ? serverFilter.GetUsrFilter(Context) : string.Empty);
Bloco de código
languagec#
public string GetUsrFilter(RMSContext contexto)
{
  if (this.DBS == null)
	this.InitServer();

  if(contexto != null)
	this.Context = contexto;
Card
iddica2
labelDica 2

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.Image Removed


Bloco de código
languagec#
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
languagec#
using (IEduHabilitacaoFilial habFilial = (IEduHabilitacaoFilial)RMSBroker.CreateRemoteObject(typeof(IEduHabilitacaoFilial), "EduHabilitacaoFilialData"))
{
	EduHabilitacaoFilialItem habFilialItem = habFilial.

Image Removed

Image Removed
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
languagec#
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
iddica3
labelDica 3

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.Image Removed

Bloco de código
languagesql
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.Image Removed

Bloco de código
languagesql
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.

Card
iddica4
labelDica 4

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.

Abaixo temos o filtro com o tipo dos campos.

Tipos disponíveis:

  • _N: número
  • _S: string;
  • _D: data.
Card
iddica5
labelDica 5

Sempre que utilizar o cache de parâmetro no lado 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
languagec#
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
languagec#
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;

...