Value type
Value type ( expressão ) -> Resultado
Parâmetro | Tipo | Descrição | |
---|---|---|---|
expressão | Expression | → | Expressão cujo valor resultante será testado |
Resultado | Integer | ← | Número do tipo de dado |
Descrição
O comando Value type devolve o tipo de valor resultante da avaliação da expressão que passou como parâmetro.
O comando devolve um valor numérico que pode ser comparado com uma das constantes abaixo do tema Tipos de campos e variáveis:
Constante | Tipo | Valor |
---|---|---|
_o_Is float | Inteiro longo | 35 |
Is BLOB | Inteiro longo | 30 |
Is Boolean | Inteiro longo | 6 |
Is collection | Inteiro longo | 42 |
Is date | Inteiro longo | 4 |
Is longint | Inteiro longo | 9 |
Is null | Inteiro longo | 255 |
Is object | Inteiro longo | 38 |
Is picture | Inteiro longo | 3 |
Is pointer | Inteiro longo | 23 |
Is real | Inteiro longo | 1 |
Is text | Inteiro longo | 2 |
Is time | Inteiro longo | 11 |
Is undefined | Inteiro longo | 5 |
Is variant | Inteiro longo | 12 |
Object array | Inteiro longo | 39 |
Este comando foi criado para devolver o tipo de uma expressão escalar, ou seja, valores armazenados ou devolvidos pela expressão. Em particular, pode ser aplicada às seguintes expressões 4D:
- Propriedades de objetos (emp.name),
- Elementos da coleção (myCol[5]).
Nota: As propriedades numéricas dos objetos sempre são consideradas valores reais:
var $o : Object
$o:=New object("value";42)
$vType:=Value type($o.value) //$vType=Is real
Value type pode ser aplicado a qualquer expressão 4D válida, incluindo campos, variáveis e parâmetros. Neste caso, diferente do comando Type, Value type devolve o tipo internal de valor resultante da avaliação da expressão e não seu tipo declarado. Dado que a linguagem 4D converte alguns tipos de valores internamente, o resultado de Value type pode diferir do tipo declarado. Por exemplo, 4D converte internamente os valores de campo de tipo "Inteiro 64 bits". Isso dá os resultados abaixo:
$vType1:=Type([myTable]Long64field) //$vType=Is integer 64 bits
$vType2:=Value type([myTable]Long64field) //$vType=Is real (em modo interpretado)
Outras diferenças estão relacionadas com arrays (a avaliação de um array devolve o índice de elementos atual) e o modo compilado. Na tabela abaixo estas diferenças são numeradas:
Tipo declarado | Type resultado | Value type resultado (interpretado) | Value type resultado (compilado) | Comentário |
---|---|---|---|---|
ARRAY TEXT($t;1) | Text array | Is real | Is longint | $t contém o índice de elemento atual, que é um número |
Campo Alfa | Is alpha field | Is text | Is text | 4D maneja internamente todas as strings como textos |
Campo Inteiro | Is integer | Is real | Is longint | Por motivos de otimização, em modo interpretado todos os valores numéricos são considerados reais e... |
Campo Inteiro Longo | Is longint | Is real | Is longint | ... em modo compilado, todos os valores inteiros são considerados inteiros longos |
Campo Inteiro 64 bits | Is integer 64 bits | Is real | Is longint |
Se quiser escrever um teste para um valor de tipo numérico válido para os modos compilado e interpretado, pode considerar o uso de um código como:
If(Value type($myValue)=Is longint)|(Value type($myValue)=Is real)
Nota de compatibilidade: A partir de 4D v16 R6, datas são armazenadas em propriedades de objeto ou com o tipo data ou como texto em formato data ISO. Para saber mais veja os comandos Dates inside objects ou SET DATABASE PARAMETER.
Exemplo 1
Se quiser manejar os vários tipos possíveis de um valor propriedade objeto:
Case of
:(Value type($o.value)=Is real)
//maneja um valor numérico
:(Value type($o.value)=Is text)
//maneja um texto
:(Value type($o.value)=Is object)
//maneja um sub-objeto
...
End case
Exemplo 2
Se quiser somar todos os valores númericos em uma coleção
var $col : Collection
var $sum : Real
$col:=New collection("Hello";20;"World2";15;50;Current date;True;10)
For($i;0;$col.length-1) //-1 já que coleções começam em 0
If(Value type($col[$i])=Is real)
$sum:=$sum+$col[$i]
End if
End for
ALERT(String($sum)) //95