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
    • dtDateTime
    • dtDate
    • dtTime
    • 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,
    • In-line,
    • Notação rápida, e
    • Referência a dicScript

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.

In-line

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:

dicField
tableNamefieldNameformuladataTypecalculated
tbCLIENTEStatusfunction status...dtStringA
function status(): string;
begin
  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';
  end else begin
    result:= 'Ok';
  end;
end;

Notação rápida

A notação rápida simplifica a especificação do código. Internamente, a linha informada em dicField.Formula é transformada no seguinte script:

{$I {configuração global SCRIPT_INCLUDE} }
function {dicField.FieldName}(): {dicField.dataType};
begin
  result:= {dicField.Formula};
end;

Ao igual que na concatenação de campos, as colunas com valor NULL, são consideradas 0 (zero), "" (vazias), etc.

Para retornar NULL, atribua sf.abortRequested:= true.

Referência

Nesta notação o valor de dicField.Formula e uma referência à tabela dicScript, com a seguinte notação:

scriptName[.functionName]

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.

Para retornar NULL, atribua sf.abortRequested:= true.