Scripts podem ser executados no início e antes de terminar a solução, sendo possível a cancelar do processo, impedindo que o usuário abra o programa ou consiga sair dele.

Clientes com Edição Enterprise, podem criar Licença de Uso Business que protege o Script de Início. Argow cuida que o texto não seja modificado sem autorização e excuta a função boolean chamada onStart ao início do processo.

Também é possível executar um script na troca de senha, após um período de inatividade no Windows ou cada vez que uma tabela é aberta.

Os scripts a serem executados são informados, para todos os usuários, na variável de configuração global SOLUTION_EVENTS, ou individualmente, em araUserInfo.itemAction:

onStart= scriptName[.functionName];
onEnd= scriptName[.functionName];
onPassword= scriptName[.functionName];
onIdle= scriptName[.functionName];
onOpenTable= scriptName[.functionName];
onPostTable= scriptName[.functionName];

Onde scriptName é uma entrada em dicScript, e functionName é uma função contida em dicScript.scriptBody. Caso functionName não seja especificada, é utilizado o nome scriptName.

No caso do onPassword, o id do usuário (araUSER.USER_ID) e o Hash da senha (araUSER.USER_PWD) são passados como parâmetros da função (function onPw( const user_id: integer; const cHash: string): boolean;)

No caso do onIdle, a função deve retornar a quantidade de segundos que devem transcorrer em estado ocioso para chamar a função outra vez (a primeira vez é chamada após um segundo). Retornando zero, a função não é chamada novamente. (Ver também sf.shell.idleMilliseconds). Notar que o tempo ocioso é contado a partir da última interação do usuário com o programa.

Quando o usuário é o administrador da solução e o script requer o cancelamento do processo (retornando false ) Argow solicita a confirmação.

No exemplo abaixo, a solução (arDemo) não pode ser utilizada por estar em manutenção, os usuários nunca podem repetir uma senha e é mantido um log com a data de acesso a cada tabela.

dicConfig
applicationvarNamevarValuedescription
arDemoSOLUTION_EVENTSonStart=se.emManutencao;
onPassword=se.checkPW;
onOpenTable=se.log;
Ativar quando necessário
dicScript
scriptNamescriptAliasscriptBodydescription
seScripts de Soluçãoprocedure emMan...Não deixa abrir a solução
function emManutencao: boolean;
begin
  sf.shell.sayInfo(
       sf.UserName + ', estamos em manutenção.\n' +
        sf.SolutionName + ' estará disponível novamente as 12:00. Obrigado!',
      'Suporte');
  result:= false; // continuar, false
end;

function checkPW( const user_id: integer; const cHash: string ): boolean;
begin
  // se (sf.user.id <> user_id) usuário corrente está mudando a senha de outro
  result:= not arQuerySql( 'Select 1 from tbSENHAS Where USER_ID = ' +
      intToStr(user_id) +
      ' And PW_HASH = ' + arQuote(cHash) );// Len(cHash)==64

  if result then begin // Nova senha, salvar
    sf.db.execSql( 'Insert into tbSENHAS( USER_ID, PW_HASH, REC_DATA) ' +
      ' Values (' + intToStr(user_id) + ', ' + arQuote(cHash) + ', getDate())' );
  end else begin
    sf.shell.sayInfo( 'Senha já utilizada, favor informar outra.', 'Senha');
  end;
end;

function log(): boolean;
begin
  result:= true;
  sf.db.execSql( 'Update dicTable Set LASTUSED_DATE= getDate(), LASTUSED_USER= ' +
    arQuote( sf.user.name ) +
    ' WHERE TABLENAME = ' + arQuote( sf.db.activeDataSet.tablename ));
  end;
end;