ORDA – Genealogia – 4º Episódio (a pedido !)

Tradução automática de Deepl

No primeiro, segundo e terceiro episódios desta série, demonstrámos o poder da ORDA e como é simples gerir pessoas relacionadas com uma única tabela, altamente repetitiva.

O episódio de hoje está centrado na interface do utilizador para o ajudar a criar listas e grelhas com bom aspecto!

Descarregar Genealogia – Episódio quatro

Caixas de listagem e texto com estilo

As caixas de listagem baseadas em matrizes e selecções permitem exibir colunas de texto com estilo. Isto levanta a questão, “Posso fazer o mesmo com caixas de listagem baseadas em colecções e selecções de entidades?

Como pode ter adivinhado, a resposta é sim, mas pode não saber como o fazer!

Claro que, se os atributos das suas entidades já estiverem estilizados, então “This.myStyledAttribute” fará o trabalho sem qualquer programação (desde que a propriedade “multi-estilo” da coluna seja verificada). Mas quando tem vários atributos (nome, nome próprio, código postal, telefone, etc.), o seu objectivo é mais…

para mostrar isto… …e não isto !

blank

Magia? nem por isso, mas STILLL fácil

Em ambos os casos acima, temos uma caixa de listagem baseada numa selecção de entidades criada utilizando DS (ver episódios anteriores). Em vez de exibir um único atributo (ex: This.name) ou mesmo uma expressão como “This.Firstname+” “+This.Lastname”, a expressão da coluna é um método 4D que retorna um texto completo.

Em um, o texto éestilizado. No outro, não é.

Texto simples (não estilizado)

$text:="""
$text: =
$text+This.Title+" "+This.Firstname+" "+This.Lastname+Char(Carriage return)
$text:
=$text+This.Address+Char(Carriage return)
...
$text: =$text+"email: "+"This.email+Char(Carriage return)
$0 : =$text

Texto estilizado com base num modelo

O truque aqui é criar um modelo de texto estilizado. Para o fazer, basta usar uma área de texto estilizado, tal como mostrado à esquerda na amostra abaixo.

A área à direita é mostrada para lembrar que o texto estilizado é baseado em etiquetas de span. É necessário evitar as etiquetas de span dentro das suas próprias etiquetas. A string “[Lastname] ” deve ser recuperada usando o comando replace string. Isto não é possível com [Lastname] ou [Lastname] (ou seja, o primeiro char em estilo diferente de cor diferente).

blank

$text:=template
$text :=Replace string($texto;"[título]";This.Title)
$text :=Replace string($text;"[nome próprio]";This.Firstname)
...
$text :=Replace string($text;"[célula]";This.Cell)
$text :=Replace string($text;"[email]";This.email)
$0: =$text

Selecções de entidades vs Colecções

“O quê? Porque devo comparar estes? Eles são completamente diferentes”!

“Sim, tens razão. Mas espere…”

As caixas de listagem baseadas nas selecções de entidades são óptimas. Podem conter milhares de entidades, exibi-las de forma muito rápida e agradável com tantas colunas quantas forem necessárias. Podem exibir dados compactos (como se viu acima) ou atributos separados, etc.

A única coisa que não podem fazer é exibir grelhas (matriz) de dados. Não podem exibir um grupo de pessoas de 1 a 100 numa primeira coluna, depois continuar o grupo de 101 a 200 numa segunda coluna, etc. Para ser honesto, as caixas de listagem baseadas numa colecção também não o podem fazer, no entanto, há uma forma agradável de o fazer com muito pouca programação.

Digamos que o nosso objectivo é exibir um grupo de pessoas como este:

blankA lista acima mostra apenas 9 pessoas, mas há mais na selecção da entidade, digamos que são 28.

apenas um pouco de matemática

A primeira coisa a fazer é encontrar uma forma de ter um número único de 0 a 28 para cada célula. Ou da esquerda para a direita, linha a linha; de cima para baixo, ou coluna a coluna.

blank

Para tal, basta chamar uma função com dois parâmetros: o número da linha e o número da coluna. Neste caso, o NumberOfColumns é 3 ($colNum de 0 a 2) e o NumberOfRows necessário é 10 ($rowNum de 0 a 9). Sabendo isto, o cálculo é fácil:
Caso “A”: $rowNum+($colNum*NumberOfRows)
Caso “B”: ($rowNum*NumberOfColumns) + $colNum

A própria caixa de listagem exibirá uma colecção preenchida com números de 0 a 9 que representarão os números das filas. Agora é ainda mais simples; não há necessidade de enviar o número da linha para a função. Cada vez que a função é chamada, o número da linha é representado por This.value! Portanto, basta enviar o número da coluna para a função para que esta possa calcular o ID de acordo com o número da linha!

E adivinhe? É isso mesmo! Em vez de devolver o calculado $i como um longint, basta devolver a informação de que precisa como myEntity[$i].name como um texto! (certifique-se apenas de que o valor de $i é inferior a myEntities.length)

Exemplo de código para o caso “A”:

As expressões para as colunas serão

CalcID(“vertical”;0) para 1ª coluna
CalcID(“vertical”;1) para a 2ª coluna
CalcID(“vertical”;2) para a 3ª coluna
(etc; se mais de 3 colunas)

Agora vamos ver como é o método CalcID!

C_TEXT
($1)
C_LONGINT ($2)
C_LONGINT ($rowNum;$colNum)
$rownum :=This.value // This.value is the current value of the collection (0,1,2,3,...) $0 $colNum :=
// $2 is given by the expression
Se ($1="vertical")$2 $0 :=$rowNum+($colNum*numberOfRows) // numberOfRows is a previously calculated value (ex: 10)
Else

:=($rowNum*numberOfCols)+$colNum // numberOfCols is a previously calculated value (ex: ")

End if

mais um truque …

Não há necessidade de criar funções individuais por tipo de resultado de que necessita. Basta enviar um parâmetro que irá determinar o que precisa em troca e fazer a sua função devolver um objecto com o atributo solicitado preenchido!

Em vez de criar três métodos (getName, getPicture, getBirthday para devolver um text, um picture e um date) e escrevendo-os em expressões de coluna…

getName(0) // getName returns a text
getPicture (0) // getPicture returns a picture
getBirthday (0) // getBirthday returns a date

… criar um único método getAttributeque devolverá um objecto preenchido de acordo com o parâmetro que lhe foi enviado.

Pergunta: Dê-me o nome da pessoa!
Responder: Aqui está um objecto com um atributo de nome contendo o que pediu!

Aqui está um exemplo do método getAttribute :

C_TEXT($1)
C_OBJECT ($0)
C_OBJECT ($result)
$result :=New object()
Case of
: // birthday is requested: returned as attribute of $resultEnd case ($1= "nome")
$result .name:=contact.name
: ($1= "retrato")
$result .portrait:=contact.portrait // portrait is requested: returned as attribute of $result
: ($1= "aniversário")
$result .birthday:=contact.birthday
// name is requested: returned as attribute of $result

$0:=$result

Uma vez escrito este método, pode chamá-lo em expressões de coluna:

getAttribute("nome").nome // getAttribute returns an object
getAttribute ("retrato").portrait // getAttribute returns an object
getAttribute("aniversário").birthday // getAttribute returns an object

Divirta-se e deixe a sua imaginação correr à solta!

Roland Lannuzel
- Proprietário do produto & Especialista 4D - Depois de estudar electrónica, a Roland entrou nas TI industriais como desenvolvedor e consultor, construindo soluções para clientes com uma variedade de bases de dados e tecnologias. No final dos anos 80, apaixonou-se pela 4D e utilizou-a para escrever aplicações comerciais que incluem sistemas de contabilidade, facturação e correio electrónico. Juntando-se à empresa em 1997, as valiosas contribuições de Roland incluem a concepção de especificações, ferramentas de teste, demonstrações, bem como formação e palestras para a comunidade 4D em muitas conferências. Ele continua a moldar activamente o futuro da 4D, definindo novas características e ferramentas de desenvolvimento de bases de dados.