Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Adicionada funcionalidade na classe Relacionamento a qual gera sufixos

nas colunas automaticamente conforme as tabelas envolvidas.
Corrigido bug na classe CenaObjetos que deletava itens no método
removeItem() quando não deveria
Tabelas agora são criadas com o atributo "Aceita Oids" marcado por
padrão
  • Loading branch information...
commit 7433033d11b19f7709f6f4ad646286b430bf5d23 1 parent 10b59db
@rkhaotix rkhaotix authored
View
8 libobjrenderer/src/cenaobjetos.cpp
@@ -321,11 +321,13 @@ void CenaObjetos::removeItem(QGraphicsItem *item)
força a destruição do objeto */
item->setVisible(false);
item->setActive(false);
+
+ //O item removido não é desalocado na chamada do método e sim quando a cena é destruída.
QGraphicsScene::removeItem(item);
- //Desaloca o objeto
- if(objeto)
- delete(objeto);
+ //Desaloca o objeto (buggy!!!)
+ //if(objeto)
+ //delete(objeto);
}
}
//-----------------------------------------------------------
View
4 libpgmodeler/src/listaoperacoes.cpp
@@ -897,7 +897,9 @@ void ListaOperacoes::executarOperacao(Operacao *oper, bool refazer)
//Caso seja uma visão atualiza os relacionamentos entre as tabelas e a visão
if(tipo==OBJETO_VISAO && oper->tipo_op==Operacao::OBJETO_MODIFICADO)
modelo->atualizarRelTabelaVisao(dynamic_cast<Visao *>(obj_grafico));
- else if(tipo==OBJETO_RELACAO && oper->tipo_op==Operacao::OBJETO_MODIFICADO)
+ else if((tipo==OBJETO_RELACAO ||
+ (tipo==OBJETO_TABELA && modelo->obterRelacionamento(dynamic_cast<TabelaBase *>(objeto), NULL))) &&
+ oper->tipo_op==Operacao::OBJETO_MODIFICADO)
modelo->validarRelacionamentos();
}
}
View
6 libpgmodeler/src/modelobd.cpp
@@ -5507,7 +5507,7 @@ RelacionamentoBase *ModeloBD::criarRelacionamento(void)
RelacionamentoBase *relacao_base=NULL;
Relacionamento *relacao=NULL;
TabelaBase *tabelas[2]={NULL, NULL};
- bool obrig_orig, obrig_dest, identificador, protegido, postergavel;
+ bool obrig_orig, obrig_dest, identificador, protegido, postergavel, sufixo_auto;
TipoPostergacao tipo_postergacao;
unsigned tipo_relac=0, i;
TipoObjetoBase tipos_tab[2]={OBJETO_VISAO, OBJETO_TABELA}, tipo_obj_rel;
@@ -5576,6 +5576,8 @@ RelacionamentoBase *ModeloBD::criarRelacionamento(void)
obrig_dest=atributos[AtributosParsers::OBRIG_DESTINO]==AtributosParsers::VERDADEIRO;
identificador=atributos[AtributosParsers::IDENTIFICADOR]==AtributosParsers::VERDADEIRO;
postergavel=atributos[AtributosParsers::POSTERGAVEL]==AtributosParsers::VERDADEIRO;
+ sufixo_auto=(atributos[AtributosParsers::SUFIXO_AUTO].isEmpty() ||
+ atributos[AtributosParsers::SUFIXO_AUTO]==AtributosParsers::VERDADEIRO);
tipo_postergacao=TipoPostergacao(atributos[AtributosParsers::TIPO_POSTERGACAO]);
//Configura o tipo do novo relacionamento
@@ -5595,7 +5597,7 @@ RelacionamentoBase *ModeloBD::criarRelacionamento(void)
dynamic_cast<Tabela *>(tabelas[0]),
dynamic_cast<Tabela *>(tabelas[1]),
obrig_orig, obrig_dest,
- atributos[AtributosParsers::SUFIXO_ORIGEM],
+ sufixo_auto, atributos[AtributosParsers::SUFIXO_ORIGEM],
atributos[AtributosParsers::SUFIXO_DESTINO],
identificador, postergavel, tipo_postergacao);
View
60 libpgmodeler/src/relacionamento.cpp
@@ -35,8 +35,8 @@ Relacionamento::Relacionamento(Relacionamento *relacao) : RelacionamentoBase(rel
//-----------------------------------------------------------
Relacionamento::Relacionamento(const QString &nome, unsigned tipo_rel, Tabela *tab_orig,
Tabela *tab_dest, bool obrig_orig, bool obrig_dest,
- const QString &sufix_orig, const QString &sufix_dest, bool identificador,
- bool postergavel, TipoPostergacao tipo_postergacao) :
+ bool sufixo_auto, const QString &sufix_orig, const QString &sufix_dest,
+ bool identificador, bool postergavel, TipoPostergacao tipo_postergacao) :
RelacionamentoBase(nome, tipo_rel, tab_orig, tab_dest, obrig_orig, obrig_dest)
{
tipo_objeto=OBJETO_RELACAO;
@@ -56,7 +56,7 @@ Relacionamento::Relacionamento(const QString &nome, unsigned tipo_rel, Tabela *t
pelo relacionamento e que participam de chaves estrangeiras */
this->sufixo_orig=sufix_orig;
this->sufixo_dest=sufix_dest;
-
+ this->sufixo_auto=sufixo_auto;
tabela_relnn=NULL;
fk_rel1n=pk_relident=pk_especial=uq_rel11=NULL;
@@ -108,6 +108,10 @@ void Relacionamento::definirSufixoTabela(unsigned tipo_tab, const QString &sufix
if(tipo_tab > TABELA_DESTINO)
throw Excecao(ERR_PGMODELER_REFOBJIDXINV,__PRETTY_FUNCTION__,__FILE__,__LINE__);
+ if(!sufixo.isEmpty() && !ObjetoBase::nomeValido(sufixo))
+ throw Excecao(Excecao::obterMensagemErro(ERR_PGMODELER_ATRSUFIXORELINV).arg(this->obterNome()),
+ ERR_PGMODELER_ATRSUFIXORELINV,__PRETTY_FUNCTION__,__FILE__,__LINE__);
+
if(tipo_tab==TABELA_ORIGEM)
sufixo_orig=sufixo;
else
@@ -1338,8 +1342,27 @@ void Relacionamento::copiarColunas(Tabela *tab_referencia, Tabela *tab_receptora
referência à tabela de origem do relacionamento, o sufixo das colunas a serem criadas
será configurado como sendo o sufixo da tabela de origem. Caso contrário o
será o da própria tabela de destino. */
- if(((tipo_relac!=RELACIONAMENTO_NN && tab_receptora==tabela_orig) ||
- (tipo_relac==RELACIONAMENTO_NN && tab_referencia==tabela_dest))
+ if(sufixo_auto)
+ {
+ if(tipo_relac==RELACIONAMENTO_1N || tipo_relac==RELACIONAMENTO_11)
+ {
+ sufixo=SEPARADOR_SUFIXO + tab_referencia->obterNome();
+
+ if(tab_referencia==tabela_orig)
+ sufixo_orig=sufixo;
+ else
+ sufixo_dest=sufixo;
+ }
+ else if(tipo_relac==RELACIONAMENTO_NN)
+ {
+ if(tab_referencia==tabela_dest)
+ sufixo=sufixo_dest=SEPARADOR_SUFIXO + tabela_dest->obterNome();
+ else
+ sufixo=sufixo_orig=SEPARADOR_SUFIXO + tabela_orig->obterNome();
+ }
+ }
+ else if(((tipo_relac!=RELACIONAMENTO_NN && tab_receptora==tabela_orig) ||
+ (tipo_relac==RELACIONAMENTO_NN && tab_referencia==tabela_dest))
&& !sufixo_dest.isEmpty())
sufixo=SEPARADOR_SUFIXO + sufixo_dest;
else if(((tipo_relac!=RELACIONAMENTO_NN && tab_receptora==tabela_dest) ||
@@ -2063,7 +2086,7 @@ bool Relacionamento::relacionamentoInvalidado(void)
Restricao *fk=NULL, *fk1=NULL, *rest=NULL, *pk=NULL;
bool valido=false;
Coluna *col1=NULL, *col2=NULL, *col3=NULL;
- QString sufixo, nome_col;
+ QString nome_col;
/* Caso o relacionamento foi invaldado por modificação
de atributos críticos já retorna a invalidez sem
@@ -2086,6 +2109,13 @@ bool Relacionamento::relacionamentoInvalidado(void)
por modificação de atributos */
else if(conectado)
{
+ /* Valida os sufixos caso a geração automática de sufixos esteja ativa.
+ Checa se os sufixos, quando preenchidos, coincidem com os nomes das tabelas respectivas */
+ if(sufixo_auto &&
+ ((!sufixo_orig.isEmpty() && sufixo_orig!=QString(SEPARADOR_SUFIXO) + tabela_orig->obterNome()) ||
+ (!sufixo_dest.isEmpty() && sufixo_dest!=QString(SEPARADOR_SUFIXO) + tabela_dest->obterNome())))
+ return(true);
+
/* Pare relacionamentos 1-1 e 1-n a verificação de
invalidação do relacionamento baseia-se na comparação da
quantidade de colunas da chave estrangeira configurada
@@ -2332,13 +2362,15 @@ QString Relacionamento::obterDefinicaoObjeto(unsigned tipo_def)
bool forma_reduzida;
definirAtributosRelacionamento();
- atributos[AtributosParsers::SUFIXO_ORIGEM]=sufixo_orig;
- atributos[AtributosParsers::SUFIXO_DESTINO]=sufixo_dest;
+ atributos[AtributosParsers::SUFIXO_ORIGEM]=(!sufixo_auto ? sufixo_orig : "");
+ atributos[AtributosParsers::SUFIXO_DESTINO]=(!sufixo_auto ? sufixo_dest : "");
atributos[AtributosParsers::IDENTIFICADOR]=(identificador ? "1" : "");
atributos[AtributosParsers::POSTERGAVEL]=(postergavel ? "1" : "");
+ atributos[AtributosParsers::SUFIXO_AUTO]=(sufixo_auto ? "1" : "");
atributos[AtributosParsers::TIPO_POSTERGACAO]=~tipo_postergacao;
atributos[AtributosParsers::NOME_TABELA]=nome_tab_relnn;
+
atributos[AtributosParsers::COLUNAS]="";
qtd=atributos_rel.size();
for(i=0; i < qtd; i++)
@@ -2379,6 +2411,17 @@ QString Relacionamento::obterDefinicaoObjeto(unsigned tipo_def)
}
}
//-----------------------------------------------------------
+void Relacionamento::definirSufixoAutomatico(bool valor)
+{
+ this->invalidado=(this->sufixo_auto!=valor);
+ this->sufixo_auto=valor;
+}
+//-----------------------------------------------------------
+bool Relacionamento::obterSufixoAutomatico(void)
+{
+ return(this->sufixo_auto);
+}
+//-----------------------------------------------------------
void Relacionamento::operator = (Relacionamento &rel)
{
(*dynamic_cast<RelacionamentoBase *>(this))=dynamic_cast<RelacionamentoBase &>(rel);
@@ -2395,5 +2438,6 @@ void Relacionamento::operator = (Relacionamento &rel)
this->tabela_relnn=NULL;
this->fk_rel1n=pk_relident=pk_especial=NULL;
this->colunas_ref.clear();
+ this->sufixo_auto=rel.sufixo_auto;
}
//***********************************************************
View
11 libpgmodeler/src/relacionamento.h
@@ -133,7 +133,11 @@ class Relacionamento: public RelacionamentoBase {
private:
/* Indica que o relacionamento teve algum atributo crítico modificado e precisa
ser revalidado */
- bool invalidado;
+ bool invalidado,
+
+ /* Define que os sufixos das colunas devem ser criados automaticamente conforme o
+ nome das tabelas envolvidas */
+ sufixo_auto;
/* Armazena a quantidade de colunas as quais foram rejeitadas no momento da ligação
relacionamento entre as tabelas. Este é usado apenas por relacionamentos de
@@ -292,6 +296,7 @@ class Relacionamento: public RelacionamentoBase {
Relacionamento(const QString &nome, unsigned tipo_rel,
Tabela *tab_orig, Tabela *tab_dest,
bool obrig_orig=false, bool obrig_dest=false,
+ bool sufixo_auto=true,
const QString &sufix_orig="", const QString &sufix_dest="",
bool identificador=false, bool postergavel=false,
TipoPostergacao tipo_postergacao=TipoPostergacao::immediate);
@@ -313,6 +318,10 @@ class Relacionamento: public RelacionamentoBase {
//Define a obrigatoriedade da tabela de origem e destino
void definirTabelaObrigatoria(unsigned id_tabela, bool valor);
+ //Define a geração automática de sufixos das colunas
+ void definirSufixoAutomatico(bool valor);
+ bool obterSufixoAutomatico(void);
+
/* Atenção: Este método só tem efeito quando o relacionamento está conectado, pois é só
nesta situação que se consegue obter as colunas geradas pela ligação do relacionamento à tabelas.
View
10 libpgmodeler_ui/src/modelowidget.cpp
@@ -741,9 +741,8 @@ void ModeloWidget::converterRelacionamentoNN(void)
//Aloca um relacionamento entre a nova tabela e a tabela de origem do relacionamento
nome_rel=QString("rel_") + tab->obterNome(false) + QString("_") + tab_orig->obterNome(false);
rel1=new Relacionamento(nome_rel, Relacionamento::RELACIONAMENTO_1N,
- tab_orig, tab, obrig_orig, false,
- rel->obterSufixoTabela(Relacionamento::TABELA_ORIGEM),
- "", true);
+ tab_orig, tab, obrig_orig, false, true,
+ "", "", true);
//Adiciona o relacionamento criado ao modelo e à lista de operações
modelo->adicionarRelacionamento(rel1);
@@ -755,9 +754,8 @@ void ModeloWidget::converterRelacionamentoNN(void)
nome_rel+=QString("1");
rel2=new Relacionamento(nome_rel, Relacionamento::RELACIONAMENTO_1N,
- tab_dest, tab, obrig_dest, false,
- rel->obterSufixoTabela(Relacionamento::TABELA_DESTINO),
- "", true);
+ tab_dest, tab, obrig_dest, false, true,
+ "", "", true);
//Adiciona o relacionamento criado ao modelo e à lista de operações
modelo->adicionarRelacionamento(rel2);
View
25 libpgmodeler_ui/src/relacionamentowidget.cpp
@@ -94,6 +94,11 @@ RelacionamentoWidget::RelacionamentoWidget(QWidget *parent): ObjetoBaseWidget(pa
connect(postergavel_chk, SIGNAL(toggled(bool)), tipo_postergacao_cmb, SLOT(setEnabled(bool)));
connect(postergavel_chk, SIGNAL(toggled(bool)), tipo_postergacao_lbl, SLOT(setEnabled(bool)));
+ connect(sufixo_auto_chk, SIGNAL(toggled(bool)), sufixo_orig_lbl, SLOT(setDisabled(bool)));
+ connect(sufixo_auto_chk, SIGNAL(toggled(bool)), sufixo_orig_edt, SLOT(setDisabled(bool)));
+ connect(sufixo_auto_chk, SIGNAL(toggled(bool)), sufixo_dest_lbl, SLOT(setDisabled(bool)));
+ connect(sufixo_auto_chk, SIGNAL(toggled(bool)), sufixo_dest_edt, SLOT(setDisabled(bool)));
+
connect(identificador_chk, SIGNAL(toggled(bool)), tab_orig_obrig_chk, SLOT(setDisabled(bool)));
connect(identificador_chk, SIGNAL(toggled(bool)), tab_dest_obrig_chk, SLOT(setDisabled(bool)));
@@ -106,6 +111,7 @@ RelacionamentoWidget::RelacionamentoWidget(QWidget *parent): ObjetoBaseWidget(pa
connect(tab_restricoes, SIGNAL(s_linhaAdicionada(int)), this, SLOT(adicionarObjeto(void)));
connect(tab_restricoes, SIGNAL(s_linhaEditada(int)), this, SLOT(editarObjeto(int)));
connect(tab_restricoes, SIGNAL(s_linhaRemovida(int)), this, SLOT(removerObjeto(int)));
+
}
catch(Excecao &e)
{
@@ -246,8 +252,14 @@ void RelacionamentoWidget::definirAtributos(ModeloBD *modelo, ListaOperacoes *li
relacao_aux=dynamic_cast<Relacionamento *>(relacao);
//Preenche os campos do formulário com os valores presentes no relacionamento
- sufixo_orig_edt->setText(QString::fromUtf8(relacao_aux->obterSufixoTabela(RelacionamentoBase::TABELA_ORIGEM)));
- sufixo_dest_edt->setText(QString::fromUtf8(relacao_aux->obterSufixoTabela(RelacionamentoBase::TABELA_DESTINO)));
+ sufixo_auto_chk->setChecked(relacao_aux->obterSufixoAutomatico());
+
+ if(!sufixo_auto_chk->isChecked())
+ {
+ sufixo_orig_edt->setText(QString::fromUtf8(relacao_aux->obterSufixoTabela(RelacionamentoBase::TABELA_ORIGEM)));
+ sufixo_dest_edt->setText(QString::fromUtf8(relacao_aux->obterSufixoTabela(RelacionamentoBase::TABELA_DESTINO)));
+ }
+
tab_orig_obrig_chk->setChecked(relacao_aux->tabelaObrigatoria(RelacionamentoBase::TABELA_ORIGEM));
tab_dest_obrig_chk->setChecked(relacao_aux->tabelaObrigatoria(RelacionamentoBase::TABELA_DESTINO));
identificador_chk->setChecked(relacao_aux->relacionamentoIdentificador());
@@ -311,13 +323,17 @@ void RelacionamentoWidget::definirAtributos(ModeloBD *modelo, ListaOperacoes *li
//Sufixo de origem: exibido para 1-n ou n-n
sufixo_orig_lbl->setVisible(rel1n || relnn);
+ //sufixo_orig_lbl->setEnabled(rel1n || relnn);
sufixo_orig_edt->setVisible(rel1n || relnn);
+ //sufixo_orig_edt->setEnabled(rel1n || relnn);
//Sufixo de destino: exibido para n-n
sufixo_dest_lbl->setVisible(rel1n || relnn);
- sufixo_dest_lbl->setEnabled(relnn);
+ //sufixo_dest_lbl->setEnabled(relnn);
sufixo_dest_edt->setVisible(rel1n || relnn);
- sufixo_dest_edt->setEnabled(relnn);
+ //sufixo_dest_edt->setEnabled(relnn);
+
+ sufixo_auto_chk->setVisible(rel1n || relnn);
//Obrigatoriedade de tabela de origem: exibido para 1-n e n-n
card_lbl->setVisible(rel1n);
@@ -649,6 +665,7 @@ void RelacionamentoWidget::aplicarConfiguracao(void)
de relacionamento */
relacao->definirSufixoTabela(RelacionamentoBase::TABELA_ORIGEM, sufixo_orig_edt->text());
relacao->definirSufixoTabela(RelacionamentoBase::TABELA_DESTINO, sufixo_dest_edt->text());
+ relacao->definirSufixoAutomatico(sufixo_auto_chk->isChecked());
relacao->definirTabelaObrigatoria(RelacionamentoBase::TABELA_ORIGEM, false);
relacao->definirTabelaObrigatoria(RelacionamentoBase::TABELA_DESTINO, false);
View
26 libpgmodeler_ui/ui/relacionamentowidget.ui
@@ -492,6 +492,9 @@
</item>
<item row="5" column="0">
<widget class="QLabel" name="sufixo_orig_lbl">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -515,8 +518,11 @@
</property>
</widget>
</item>
- <item row="5" column="1" colspan="2">
+ <item row="5" column="1">
<widget class="QLineEdit" name="sufixo_orig_edt">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="maximumSize">
<size>
<width>16777215</width>
@@ -527,6 +533,9 @@
</item>
<item row="6" column="0">
<widget class="QLabel" name="sufixo_dest_lbl">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -550,8 +559,11 @@
</property>
</widget>
</item>
- <item row="6" column="1" colspan="2">
+ <item row="6" column="1">
<widget class="QLineEdit" name="sufixo_dest_edt">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="maximumSize">
<size>
<width>16777215</width>
@@ -700,6 +712,16 @@
</property>
</spacer>
</item>
+ <item row="5" column="2" rowspan="2">
+ <widget class="QCheckBox" name="sufixo_auto_chk">
+ <property name="text">
+ <string>Sufixo Automático</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
View
3  libpgmodeler_ui/ui/tabelawidget.ui
@@ -50,6 +50,9 @@
<property name="text">
<string/>
</property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
</widget>
</item>
<item row="1" column="0" colspan="2">
View
3  libutil/src/atributosparsers.h
@@ -346,7 +346,8 @@ static const QString
VISIVEL="visible",
WIDGET="widget",
INFO_POSICAO="pos-info",
- CONEXOES="connections";
+ CONEXOES="connections",
+ SUFIXO_AUTO="auto-sufix";
}
//***********************************************************
#endif
View
1  libutil/src/excecao.cpp
@@ -136,6 +136,7 @@ QString Excecao::mensagens[QTD_ERROS][2]={
{"ERR_PGMODELER_ATRALINHAMENTOINVTIPO",QObject::tr("Atribuição de alinhamento inválido ao tipo '%1'!")},
{"ERR_PGMODELER_ATRNOMEINVTABRELNN", QObject::tr("Atribuição de nome inválido à tabela gerada por relacionamento N-N!")},
{"ERR_PGMODELER_PKESPTIPORELINV", QObject::tr("O relacionamento '%1' não pode fazer uso da chave-primária especial. Apenas relacionamentos de generalização/dependência têm acesso a este recurso!")},
+{"ERR_PGMODELER_ATRSUFIXORELINV", QObject::tr("Atribuição de sufixo inválido ao relacionamento '%1'!")},
{"ERR_PGMODELERUI_OPROBJINCRELACAO", QObject::tr("O objeto '%1' (%2) não pode ser editado ou excluído por ter sido incluído automaticamente através de relacionamento! Para manipular o objeto é necessário fazê-lo a partir do formulário de edição do relacionamento que o detém.")},
{"ERR_PGMODELERUI_REMOBJPROTEGIDO", QObject::tr("O objeto '%1' (%2) não pode ser excluído por estar protegido!")},
{"ERR_PGMODELERUI_REDECLGRUPODESTAQUE", QObject::tr("O grupo '%1' já foi declarado anteriormente!")},
View
3  libutil/src/excecao.h
@@ -33,7 +33,7 @@
#include <deque>
using namespace std;
-const int QTD_ERROS=174; //177;
+const int QTD_ERROS=175; //177;
/*
Formato dos enums de erros: ERR_[BIBLIOTECA]_[ERRO] onde:
@@ -185,6 +185,7 @@ enum TipoErro {
ERR_PGMODELER_ATRALINHAMENTOINVTIPO,
ERR_PGMODELER_ATRNOMEINVTABRELNN,
ERR_PGMODELER_PKESPTIPORELINV,
+ ERR_PGMODELER_ATRSUFIXORELINV,
ERR_PGMODELERUI_OPROBJINCRELACAO,
ERR_PGMODELERUI_REMOBJPROTEGIDO,
View
3  schemas/xml/dtd/relationship.dtd
@@ -16,9 +16,10 @@
<!ATTLIST relationship dst-table CDATA #REQUIRED>
<!ATTLIST relationship src-sufix CDATA #IMPLIED>
<!ATTLIST relationship dst-sufix CDATA #IMPLIED>
+<!ATTLIST relationship auto-sufix (false|true) "true">
<!ATTLIST relationship table-name CDATA #IMPLIED>
<!ATTLIST relationship identifier (false|true) "false">
-<!ATTLIST relationship deferrable (true | false) "false">
+<!ATTLIST relationship deferrable (true |false) "false">
<!ATTLIST relationship defer-type CDATA #IMPLIED>
<!ELEMENT line (position+)>
View
4 schemas/xml/relationship.sch
@@ -27,6 +27,10 @@ $tb
$tb [ dst-sufix=] "@{dst-sufix}" $br
%end
+%if @{auto-sufix} %then
+ $tb [ auto-sufix=] "true" $br
+%end
+
%if @{identifier} %then
$tb $sp identifier="true" $br
%end
Please sign in to comment.
Something went wrong with that request. Please try again.