Argow [Coluna Calculada]
As colunas calculadas são criadas em Argow especificando:
dicField.dataType ← <tipo de dados>
que pode ser um dos seguintes tipos básicos:
dtString, o tamanho x é especificado em dicField.DataEditor ← ( size=x )
dtInteger
dtDouble
dtCurrency
dtBoolean
dicField.Calculated ← <uma letra>, que representa a ordem de criação
dicField.Formula ← <script>
que pode ter uma das seguintes notações:
Concatenação de campos,
Concatenação de campos
Nesta notação, as colunas da tabela estão disponíveis para as quatro operações básicas, sem usar parêntesis. Tem como principal vantagem a velocidade de calculo, que é feito a baixo nível, sem criação de script. As colunas com valor NULL são consideradas 0 (zero), "" (vazias), etc.
No exemplo abaixo, as diversas colunas de um endereço são concatenadas:
LOGRADOURO + ', ' + NUMERO + #13 + #10 + CEP + ' - ' + CIDADE
Lembrar que o sinal de decimal é representado por ponto (sempre antecedido de um número):
VALOR_TOTAL * 1.4
Quando uma tabela tem chave primária composta (dicTable.primaryKey), Argow cria uma coluna dtString concatenando os valores, chamada AR_PrimaryKey.
Neste caso o script, que está em dicField.Formula, deve conter uma função com o mesmo nome que dicField.FieldName que retorna um valor do tipo dicField.dataType (ou variant). Para ser reconhecida como in-line a primeira palavra do texto deve ser function.
Para retornar NULL, atribua sf.abortRequested:= true.
No exemplo, uma coluna string, informa o status dos clientes:
tableName fieldName formula dataType calculated
tbCLIENTE Status function status... dtString A
function status(): string;
if ( arIsNull( VALOR_TOTAL, 0 ) = 0 ) then begin
result:= 'Sem deuda';
end else if ( VALOR_TOTAL > 100000 ) then begin
result:= 'Alerta!';
end else if ( VALOR_TOTAL > 10000 ) then begin
result:= 'Atenção';
end else if ( VALOR_TOTAL > 1000 ) then begin
result:= 'Leve';
Nesta notação o valor de dicField.Formula e uma referência à tabela dicScript, com a seguinte notação:
Onde scriptName é uma entrada em dicScript, e functionName é a função, contida em dicScript.scriptBody, que retorna um valor do tipo dicField.dataType e não recebe parâmetros. Se functionName não for especificado, será utilizado dicField.fieldName.