DATA PROPS
1 - Adicione a tabela complementar no XSD
da tabela principal, apenas com os campos da chave.
2 - No DataProps
, configure a tabela de forma semelhante ao código abaixo:
private void SetComplDataProps(DataTable szaltacompl)
{
DataProps.SetProps([NOME_TABELA],
TabProps.UserFieldsApp, CodSistema.[CODIGO_SISTEMA],
TabProps.Caption, [CAPTION_TABELA],
TabProps.DetailMode, DetailMode.UserFields);
}
DESIGNER FORMULÁRIO
1 - Criar a step do processo com os campos complementares e incluir o componente RMSUserFieldsView
:
2 - Adicionar um DataSet
que aponte para o DataSet
da tabela relacionada aos campos complementares.
3 - Crie um novo componente RMSBindingSource
para ser o BindingSourceMaster
do formulário. Defina seu DataSource
como o DataSet
criado anteriormente e seu DataMember
como a tabela principal do formulário, para a qual a tabela de campos complementares está apontada.
4 - Crie um outro componente RMSBindingSource
igual ao anterior, porém para os campos complementares e apontando seu DataMember
para a tabela de campos complementares criada anteriormente na edição do XSD.
5 - Verifique a ordem da declaração destes campos no .cs.designer
do formulário, pois caso a ordem esteja diferente do abaixo pode não funcionar corretamente.
I - Tab do formulário
II - RMSUserFieldsView
III - RMSBindingSource (Master)
IV - RMSBindingSource (Compl)
V - DataSet
VI - O formulário em si.
6 - Adicione um evento BeforeExecute. Tal evento deve ser inserido manualmente e ficar, no arquivo .cs.designer, como abaixo das declarações dos outros eventos, segundo imagem abaixo:
7 - Crie os seguintes métodos:
private void LoadComplFields()
{
if ([DATAROW_PROCESSO] != null)
{
//Carrega o DataSet do processo com as tabelas dos campos complementares.
RMSDataClient Client = new RMSDataClient("[NOME_DATASERVER]");
Client.ReadRecord([DATASET], new object[] { CHAVE_PRIMÁRIA }, null);
SetComplFields();
}
}
private void SetComplFields()
{
if (rmsBindingSourceCamposCompl.Row.RowState == DataRowState.Added)
{
RMSBindingSource rmsBSAux = new RMSBindingSource(this.components);
DataTable tabPdoAux = rmsBindingSourceMaster.Table;
rmsBSAux.DataSource = tabPdoAux;
rmsBindingSourceCamposCompl.MasterBindingSource = rmsBSAux;
rmsBSAux.AddNew();
rmsComplFields.LoadFields();
}
//Realiza a verificação se existem campos complementares para esta tabela, baseado no número de colunas
_hasComplementaryFields = (rmsBindingSourceCamposCompl?.Table?.Columns?.Count ?? 0) > MIN_DISCHARGE_COMPL_COLUMN_COUNT;
}
8 - Chame o método LoadComplFields
no evento de Load
do Form.
9 - Na classe de ParamsProc
associada ao processo, exponha como propriedade um DataSet
chamado ComplementaryFields
.
9 - No evento BeforeExecute
criado anteriormente, coloque o seguinte código:
private void Form_BeforeExecute(object sender, EventArgs e)
{
var paramProc = (([NOME_CLASSE]ParamsProc)this.Parameters);
if (rmsBindingSourceCamposCompl.Row != null)
{
rmsBindingSourceCamposCompl.Row["CAMPO_PK1"] = rmsBindingSourceMaster.Row["CAMPO_PK1"];
rmsBindingSourceCamposCompl.Row["CAMPO_PK2"] = rmsBindingSourceMaster.Row["CAMPO_PK2"];
rmsBindingSourceCamposCompl.Row["CAMPO_PK_N"] = rmsBindingSourceMaster.Row["CAMPO_PK_N"];
this.rmsBindingSourceCamposCompl.Post();
}
DataSet complementaryFields = new DataSet("COMPLEMENTARYFIELDS");
complementaryFields.Tables.Add([DATASET].[NOME_TABELA].Copy());
paramProc.ComplementaryFields = complementaryFields;
}
DATA SERVER
1 - No DataServer relacionado a tabela principal, no método DoReadRecord, adicione o seguinte código:
this.DBS.QueryFill(dataSet, [NOME_TABELA],
@"SELECT * FROM [NOME_TABELA] (NOLOCK)
WHERE [PK]", primaryKey);
2 - Ao final deste mesmo método, adicione a linha:
this.GetUserFields(dataSet, NOME_TABELA, primaryKey);
SERVER
1 - Na camada server, preferencialmente em um RMSObject
, crie o seguinte método:
public virtual void SaveComplementaryFields(DataSet dtComplFields)
{
if (dtComplFields == null) return;
RMSDataUtils.SetDateTimeFormat(dtComplFields);
DataTable changes = dtComplFields.Tables["[NOME_TABELA]"].GetChanges();
if (changes != null && changes.Rows.Count > 0)
{
DBS.SetConflictOption(changes, ConflictOption.OverwriteChanges);
DBS.QueryUpdate(changes, DbServices.UpdateMode.Update);
}
}
2 - Caso tenha criado este método em um RMSObject
, crie um RMSModule
para chamá-lo.
3 - No método DoExecute
do server do processo (classe filha de RMSProcess
), adicione a chamada ao módule da inserção dos campos complementares (método criado no passo anterior).
CONCLUSÃO
Caso não funcione conforme o esperado ou algum destes passos apresente erro, há um exemplo desta implementação no formulário RM.Sau.RegistroAtendimento.SauPatientDischargeProcForm
.