sc_redir não funciona dentro de um IF

Senhores peço ajuda:

Tenho uma estrutura de código que quando eu uso a macro sc_redir(aplicacao) dentro de uma estrutura de IF (que está correta porque estou trackeando os resultados) o fluxo do programa não é desviado para ‘aplicacao’. Porém, se eu coloco o a mesma macro fora da estrutura IF, a macro desvia o fluxo para aplicação indicada.
Repito, não há erro no bloco abaixo do IF porque nesse bloco tem um UPDATE de uma tabela que está sendo feito corretamente e, além disso, eu faço o commit_trans() antes do sc_redir.
Resumindo, dentro de um blco de instruções IF a macro sc_redir NÃO funciona (não redireciona para a aplicação indicada) mas fora do bloco IF ela funciona.
Esse bloco de instruções está numa função chamada dentro de um “onLoad”. Nessa função, quando uma variável de tempo restante chega a zero ou menor que zero, a macro deveria ir para uma aplicação do tipo blank que informaria ao usuário que o período de tempo acabou.

Alguém sabe me dizer porque dentro de um IF o sc_redir não funciona?

Agradeço a ajuda.

César Azeredo

Cole seu código aqui.

Aplicação principal Realizar_Prova - evento onload, onde é chamada a função de controle de tempo

{w_numProvaQuestao}=" “.{numeroDaProva}.” / ".{numeroSequenciaQuestao};
[w_status]={status};

if ({w_nomeCandidato}==null)
{
$w_comandoSQL= ‘SELECT “nomeCandidato” FROM public.“tb_candidatos” WHERE id =’.{idCandidato}.’;’;
sc_lookup(w_dataset,$w_comandoSQL);

	if (empty({w_dataset})) 
			{echo "Erro - Não achei Id Candidato na Tabela : ".{idCandidato};}
	else 	{
				{w_nomeCandidato}={w_dataset[0][0]};
				$w_comandoSQL= 'SELECT "nomeProcesso" FROM public."tb_processosSeletivos" WHERE id ='.{idProcesso}.';';
				sc_lookup(w_dataset,$w_comandoSQL);

				if (empty({w_dataset})) 
					{
						echo "Erro - Não achei Id Processo na Tabela : ".{idCandidato};
					}
				else 	
					{
						{w_nomeProcesso}={w_dataset[0][0]};
					}
			}
}

[w_idCandidato]={idCandidato};
[w_idQuestao]={idQuestao};
[w_numeroProva]={numeroDaProva};
[w_respostaCandidato]={respostaCandidato};
[w_idPerfilProva]={idPerfilProva};
{w_marcarRegistro}={status};
echo " Iniciado Controle de Tempo : ".{w_iniciadoControleTempo}; // para o tracking da aplicação
if ({w_iniciadoControleTempo}==“N”)
{
obtemtempoprova();
{w_iniciadoControleTempo}=“S”;
echo " Iniciado Controle de Tempo : ".{w_iniciadoControleTempo}; // para o tracking da aplicação
}

calculatempodecorrido(); // chamada do controle de tempo da prova

{w_tempoRestanteTexto}= {w_horastempoDecorrido}.":".{w_minutostempoDecorrido}.":".{w_segundostempoDecorrido};
echo " Tempo Decorrido : “.{w_horastempoDecorrido}.”:".{w_minutostempoDecorrido}.":".{w_segundostempoDecorrido};

switch ({status})
{
case 0:
sc_field_display({w_marcarRegistro}, off);;
break;
case 1:
sc_field_display({w_marcarRegistro}, on);
// sc_field_color({status},"#FFFF00");
break;
case 2:
sc_field_display({w_marcarRegistro}, on);
// sc_field_color({status},"#CC0000");
break;
}

apresentaEnunciado();

//------------------- Função calculatempodecorrido() está em uma biblioteca do projeto -------------------------

function calculatempodecorrido()
{
$w_horarioAtual=date(‘H:i:s’);

	$w_pieces = explode(":", $w_horarioAtual);
	$w_horasAtual= $w_pieces[0];
	$w_minutosAtual= $w_pieces[1];
	$w_segundosAtual= $w_pieces[2];

	echo " Horario Corrente : ".$w_horasAtual.":".$w_minutosAtual.":".$w_segundosAtual;

	{w_totalSegundosHorarioAtual}= ($w_horasAtual*3600)+($w_minutosAtual*60)+$w_segundosAtual;
	echo "  Total Segundos Fim Prova : ".{w_totalSegundosFimProva};
	echo "  Total Segundos Horario Atual : ".{w_totalSegundosHorarioAtual};
	
	[w_tempoRestante]={w_totalSegundosFimProva}-{w_totalSegundosHorarioAtual};
	echo "  Tempo Restante : ".[w_tempoRestante];

	if ([w_tempoRestante]<=0)
		{
			$w_comandoSQL4= 'UPDATE public."tb_provasGeradasProCandidato" SET "provaCompletada" = 1, "dataProvaCompletada" =	now()  WHERE "numeroDaProva" ='.[w_numeroProva].';';
			sc_exec_sql($w_comandoSQL4);			    
			sc_commit_trans();
			[w_msgStatusProva]= "TEMPO DE PROVA ENCERRADO :  PROVA No. ".{numeroDaProva}."  - Candidato : ".{w_nomeCandidato}. "  FINALIZADA !";

			sc_alert([w_msgStatusProva]);
			sc_redir(encerra_prova);
		}
	else
		{
			{w_horastempoDecorrido} = intval([w_tempoRestante]/3600);

			{w_minutostempoDecorrido} = intval(([w_tempoRestante]-({w_horastempoDecorrido}*3600))/60);
			{w_segundostempoDecorrido} = [w_tempoRestante] - ({w_horastempoDecorrido}*3600)-({w_minutostempoDecorrido}*60);


		}
}

As evidencias estão no Google Drive : https://drive.google.com/open?id=1XShG7v9KA6K6eSXifchVFhWYgU9syUgD

Obrigado Haroldo

calculatempodecorrido() que tipo de biblioteca?

É uma biblioteca interna do projeto. Eu tenho duas bibliotecas do projeto que estão, ambas, funcionando.
Reitero que o update da tabela tb_provasGeradasProCandidato está sendo realizado corretamente.
O problema é que seu eu coloco o sc_redir dentro de um IF ele não funciona.
Porém se eu chamo a macro fora de uma estrutura de IF ela funciona a vai para a aplicação blank “encerra_prova”.
Eu já testei isso colocando no onload do “Realizar_Prova” a chamada a macro sc_redir(encerra_prova) após a instrução

calculatempodecorrido(); // chamada do controle de tempo da prova

…que vc pode ver abaixo.

Se eu simplesmente execute o sc_redir fora do IF ele funciona.
Tenho outras aplicações com sc_redir (inclusive em ajax) que funciona, sem problemas.

O que poderia ser?

Analise o código fonte gerado nessa posição do IF.

Tente usar header location

Haroldo, este é o códgio php gerado pelo SC da parte onde ocorre o problema.
Estou anexando ele todo pra que não perca o contexto.
Veja que a macro sc_redir gera o location href para o “encerra_prova”.
Só não entendi o bloco IF gerado pelo SC !!!
Antes da instrução echo, não tinha que ter um “;” ???
Veja abaixo:

$this->nm_mens_alert[] = $this->sc_temp_w_msgStatusProva; if ($this->NM_ajax_flag) { $this->sc_ajax_alert($this->sc_temp_w_msgStatusProva); }echo ‘’;

O código todo da parte problemática está aí embaixo.
Obrigado pelo apoio.

// ----------------
function calculatempodecorrido()

{

$_SESSION[‘scriptcase’][‘Realizar_Prova’][‘contr_erro’] = ‘on’;
if (!isset($this->sc_temp_w_msgStatusProva)) {$this->sc_temp_w_msgStatusProva = (isset($_SESSION[‘w_msgStatusProva’])) ? $_SESSION[‘w_msgStatusProva’] : “”;}
if (!isset($this->sc_temp_w_numeroProva)) {$this->sc_temp_w_numeroProva = (isset($_SESSION[‘w_numeroProva’])) ? $_SESSION[‘w_numeroProva’] : “”;}
if (!isset($this->sc_temp_w_tempoRestante)) {$this->sc_temp_w_tempoRestante = (isset($_SESSION[‘w_tempoRestante’])) ? $_SESSION[‘w_tempoRestante’] : “”;}

	$w_horarioAtual=date('H:i:s');

	

	$w_pieces = explode(":", $w_horarioAtual);

	$w_horasAtual= $w_pieces[0];

	$w_minutosAtual= $w_pieces[1];

	$w_segundosAtual= $w_pieces[2];



	echo " Horario Corrente : ".$w_horasAtual.":".$w_minutosAtual.":".$w_segundosAtual;



	$w_totalsegundoshorarioatual = ($w_horasAtual*3600)+($w_minutosAtual*60)+$w_segundosAtual;

	echo "  Total Segundos Fim Prova : ".$this->w_totalsegundosfimprova ;

	echo "  Total Segundos Horario Atual : ".$w_totalsegundoshorarioatual ;

	

	$this->sc_temp_w_tempoRestante=$this->w_totalsegundosfimprova -$w_totalsegundoshorarioatual ;

	echo "  Tempo Restante : ".$this->sc_temp_w_tempoRestante;



	if ($this->sc_temp_w_tempoRestante<=0)

		{

			$w_comandoSQL4= 'UPDATE public."tb_provasGeradasProCandidato" SET "provaCompletada" = 1, "dataProvaCompletada" =	now()  WHERE "numeroDaProva" ='.$this->sc_temp_w_numeroProva.';';

			
 $nm_select = $w_comandoSQL4; 
     $_SESSION['scriptcase']['sc_sql_ult_comando'] = $nm_select;
  $_SESSION['scriptcase']['sc_sql_ult_conexao'] = ''; 
     $rf = $this->Db->Execute($nm_select);
     if ($rf === false)
     {
         $this->Erro->mensagem (__FILE__, __LINE__, "banco", $this->Ini->Nm_lang['lang_errm_dber'], $this->Db->ErrorMsg());
         $this->NM_rollback_db(); 
         if ($this->NM_ajax_flag)
         {
            Realizar_Prova_pack_ajax_response();
         }
         exit;
     }
     $rf->Close();
  ;			    

			if ($this->Ini->sc_tem_trans_banco)

{
$this->Db->CommitTrans();
$this->Ini->sc_tem_trans_banco = false;
}

			$this->sc_temp_w_msgStatusProva= "TEMPO DE PROVA ENCERRADO :  PROVA No. ".$this->numerodaprova ."  - Candidato : ".$this->w_nomecandidato . "  FINALIZADA !";



			[b]$this->nm_mens_alert[] = $this->sc_temp_w_msgStatusProva; if ($this->NM_ajax_flag) { $this->sc_ajax_alert($this->sc_temp_w_msgStatusProva); }echo '<script>location.href="encerra_prova.php#tabs-3";</script>';[/b]

		}

	else

		{

			$this->w_horastempodecorrido  = intval($this->sc_temp_w_tempoRestante/3600);



			$this->w_minutostempodecorrido  = intval(($this->sc_temp_w_tempoRestante-($this->w_horastempodecorrido *3600))/60);

			$this->w_segundostempodecorrido  = $this->sc_temp_w_tempoRestante - ($this->w_horastempodecorrido *3600)-($this->w_minutostempodecorrido *60);





		}

Haroldo, coloquei o código da função toda no notepad++ e o editor aponta que a “}” imediatamente antes do echo não está “fechando” com nenhuma “{”.
Está me parecendo que isso é um bugzinho que o montador php não “pegou”.
Não pode ser?

Porém ocorreu que eu fiz 2 modificações no código da função:

Primeiro eu comentei a instrução sc_redir(encerra_prova) e coloquei diretamente a instrução echo ‘’;
Como não funcionou, voltei a instrução sc_redir original e comentei o script. Veja abaixo:


	if ([w_tempoRestante]<=0)
		{
			$w_comandoSQL4= 'UPDATE public."tb_provasGeradasProCandidato" SET "provaCompletada" = 1, "dataProvaCompletada" =	now()  WHERE "numeroDaProva" ='.[w_numeroProva].';';
			sc_exec_sql($w_comandoSQL4);			    
			sc_commit_trans();
			[w_msgStatusProva]= "TEMPO DE PROVA ENCERRADO :  PROVA No. ".{numeroDaProva}."  - Candidato : ".{w_nomeCandidato}. "  FINALIZADA !";

			sc_alert([w_msgStatusProva]);
			sc_redir(encerra_prova);

// echo ‘’;
}
else
{
{w_horastempoDecorrido} = intval([w_tempoRestante]/3600);

			{w_minutostempoDecorrido} = intval(([w_tempoRestante]-({w_horastempoDecorrido}*3600))/60);
			{w_segundostempoDecorrido} = [w_tempoRestante] - ({w_horastempoDecorrido}*3600)-({w_minutostempoDecorrido}*60);


		}

… e o resultado no código gerado no php foi completamente outro daquele que lhe enviei.

Veja:


	if ($this->sc_temp_w_tempoRestante<=0)

		{

			$w_comandoSQL4= 'UPDATE public."tb_provasGeradasProCandidato" SET "provaCompletada" = 1, "dataProvaCompletada" =	now()  WHERE "numeroDaProva" ='.$this->sc_temp_w_numeroProva.';';

			
 $nm_select = $w_comandoSQL4; 
     $_SESSION['scriptcase']['sc_sql_ult_comando'] = $nm_select;
  $_SESSION['scriptcase']['sc_sql_ult_conexao'] = ''; 
     $rf = $this->Db->Execute($nm_select);
     if ($rf === false)
     {
         $this->Erro->mensagem (__FILE__, __LINE__, "banco", $this->Ini->Nm_lang['lang_errm_dber'], $this->Db->ErrorMsg());
         $this->NM_rollback_db(); 
         if ($this->NM_ajax_flag)
         {
            Realizar_Prova_pack_ajax_response();
         }
         exit;
     }
     $rf->Close();
  ;			    

			if ($this->Ini->sc_tem_trans_banco)

{
$this->Db->CommitTrans();
$this->Ini->sc_tem_trans_banco = false;
}

			$this->sc_temp_w_msgStatusProva= "TEMPO DE PROVA ENCERRADO :  PROVA No. ".$this->numerodaprova ."  - Candidato : ".$this->w_nomecandidato . "  FINALIZADA !";



			$this->nm_mens_alert[] = $this->sc_temp_w_msgStatusProva; [u][b]if ($this->NM_ajax_flag) { $this->sc_ajax_alert($this->sc_temp_w_msgStatusProva); } if (isset($this->sc_temp_w_tempoRestante)) { $_SESSION['w_tempoRestante'] = $this->sc_temp_w_tempoRestante;}

if (isset($this->sc_temp_w_numeroProva)) { $_SESSION[‘w_numeroProva’] = $this->sc_temp_w_numeroProva;}
if (isset($this->sc_temp_w_msgStatusProva)) { $_SESSION[‘w_msgStatusProva’] = $this->sc_temp_w_msgStatusProva;}
if (!isset($this->Campos_Mens_erro) || empty($this->Campos_Mens_erro))
{
$this->nmgp_redireciona_form($this->Ini->path_link . “” . SC_dir_app_name(‘encerra_prova’) . “/”, $this->nm_location, “”, “_self”, “ret_self”, 440, 630);[/b][/u]
};

		}

	else

		{

			$this->w_horastempodecorrido  = intval($this->sc_temp_w_tempoRestante/3600);



			$this->w_minutostempodecorrido  = intval(($this->sc_temp_w_tempoRestante-($this->w_horastempodecorrido *3600))/60);

			$this->w_segundostempodecorrido  = $this->sc_temp_w_tempoRestante - ($this->w_horastempodecorrido *3600)-($this->w_minutostempodecorrido *60);





		}

Vc tem ideia do que pode estar acontecendo???

Pessoal, boa noite.

Alguém pode ajudar nesse problema?
Se houver um jeito de “disparar” a teclar “Sair” a partir da aplicação, resolve também.
Podem me ajudar?

Grato.

?>
<script>
$(document).ready(function(){
   $("#sc_b_sai_t").click(); //tecla sair superior
   $("#sc_b_sai_b").click(); //tecla sair inferior
});
</script>
<?php

Ronyan, boa noite.

Obrigado pela sugestão, mas devo dizer que não funcionou.
Apliquei o script que sugeriu criando um método php “clicar_em_sair”.
Na função calculatempodecorrido (da biblioteca interna), quando a variável global [tempoRestante] resulta em menor ou igual a zero, a mensagem do sc_alert aparece na tela, mas a tela com a prova não desaparece, como seria de se esperar quando é clicado o botão SAIR.
O usuário continua acessando o conteúdo da prova (inclusive alterando conteúdo), embora a cada vez que faça isso apareça a mensagem do sc_alert.
Esse efeito eu havia conseguido usando o sc_redir, que não funciona.
Ou seja, não é reproduzido o mesmo efeito que clicar no botão SAIR que, aí sim, seria o correto.
Estou mandado o método que eu criei (clicar_em_sair():wink: e como está aplicado na função calculatempodecorrido() que é chamada pela aplicação Realizar_Prova.
Veja se pode me ajudar.
Também entrei em contato com o Kayako do “bugs” da scriptcase e ele apresentou um argumento que não era plausível em face aos exemplos que eu postei.
Tenho que entregar a aplicação e não sei como fazer para resolver isso.
Veja abaixo como apliquei o que sugeriu e obrigado.

Método php “clicar_em_sair()” criado na aplicação Realizar_Prova:

?>

<?php Como está aplicado na função calculatempodecorrido(): if ([tempoRestante]<=0) { $w_comandoSQL4= 'UPDATE public."tb_provasGeradasProCandidato" SET "provaCompletada" = 1, "dataProvaCompletada" = now() WHERE "numeroDaProva" ='.[w_numeroProva].';'; sc_exec_sql($w_comandoSQL4); sc_commit_trans(); $w_msg= "TEMPO DE PROVA ENCERRADO : PROVA No. ".{numeroDaProva}." - Candidato : ".{w_nomeCandidato}. " FINALIZADA !"; sc_alert($w_msg); // sc_redir(encerra_prova); clicar_em_sair(); } else { $w_hrsTempoRestante = intval([tempoRestante]/3600); $w_minTempoRestante = intval(([tempoRestante]-($w_hrsTempoRestante*3600))/60); $w_segTempoRestante = [tempoRestante] - ($w_hrsTempoRestante*3600)-($w_minTempoRestante*60); [tempoRestanteTexto]=$w_hrsTempoRestante.":".$w_minTempoRestante.":".$w_segTempoRestante; }