(RESOLVIDO) - Contar registros

Boa tarde a todos…

Tenho uma aplicação de controle que faz algumas verificações pra definir o redirecionamento entre outras coisas.
O que eu estou querendo fazer é um select em uma tabela e contar a quantidade de registros encontrados. Tipo quantas linhas terá no array do dataset de resultado. O que eu preciso é se o número de registros encontrados for, por exemplo, maior que 2, então não será possível submeter. Algo assim.

Alguém poderia me orientar por favor?

Boa noite,

O Sr. pode fazer um SELECT COUNT na sua tabela com a macro sc_lookup.

att,
Bernhard Bernsmann

Certo, entendi, já pesquisei a respeito na web sobre o select count… mas poderia me orientar sobre como tratar isso como um valor, por exemplo, o retorno desse select count se ele for menor ou igual a 2 registros, faça isso, caso contrário, faça aquilo…dentro de if else?

Tipo a estrutura abaixo:

$check_table = ‘projetos’; // Nome da tabela
$check_where = “status = ‘Em avaliação’”; // Condição

$check_sql = ‘SELECT id_proponente’
. ’ FROM ’ . $check_table
. ’ WHERE ’ . $check_where;
sc_lookup(ds, $check_sql);

if (isset({ds[0][0]}))
{
???
}
else
{
sc_error_message(‘Não é possível submeter projeto, pois o proponente já excedeu o máximo de projetos submetidos permitidos!’);
}

Grato pela atenção!

O SELECT COUNT só retorna 1 valor, que será armazenado na posição [0][0] do seu array.

Então o que o Sr. precisa fazer é trabalhar em cima do {ds[0][0]} fazendo quaisquer verificações de lógica programacional.

O Sr. pode sempre entrar em contato com nosso suporte.

Att,
Bernhard Bernsmann

Alguém pode me ajudar… tentei o seguinte código

/**
 * Recuperando o número de projetos submetidos do proponente
 */

// Check for record
$check_sql = "SELECT COUNT(*) FROM projetos WHERE (id_proponentes = '{proponente}') AND (status = 'Submetido')";
sc_lookup(rs, $check_sql);

if ({rs[0][0]}>1)     // Row found
{
    sc_error_message('Este proponente já submeteu o máximo de projetos permitidos.');
}

Testei o comando SQL no sql builder e tá funcionando, mas o código não está barrando, ou seja, quando um determinado proponente já submeteu um projeto, e tenta submeter um segundo, não aparece o erro.

Eu acho que o número que é retornado é uma string e não integer. Tentei armazenar o resultado do {rs[0][0]} em uma variável e tentei converter com int($string) mas também não deu certo.

Alguém pode me ajudar?

Guto simples.

Faça assim:

[code]if(count({rs})>1) {


}[/code]

Ou ainda:

[code]$registros = count({rs});

switch($registros) {
case 1:

break;
case 2:

break;
}[/code]

  • {rs} é uma matriz a quantidade de retornos dela é a quantidade de registros no banco, ai você nem precisa usar SELECT Count, um select normal buscando qualquer coisa do banco já retorna pra você.

Então fiz assim, mas não funciona… continua submetendo normalmente… na hora q submetesse um projeto, não poderia submeter outro.
Tem alguma ideia?

[code]/**

  • Recuperando o número de projetos submetidos do proponente
    */

// Check for record
$check_sql = “SELECT id FROM projetos WHERE (id_proponentes = ‘{proponente}’) AND (status = ‘Submetido’)”;
sc_lookup(rs, $check_sql);

if(count({rs})>1) // Row found
{
sc_error_message(‘Este proponente já submeteu o máximo de projetos permitidos.’);
}[/code]

Guto rode a aplicação em modo debug, e posta como saiu o SQL. Verifique se não ocorreu nenhum erro. E coloque também um else { sc_error_message(‘ELSE’) } só pra ver o que ocorre.

O problema inicial foi resolvido… tinha que tá escrito assim: if (count({rs}>1)) e não if (count({rs})>1).

O meu código ficou assim em onValidate:

/**
 * Recuperando o número de projetos submetidos do proponente
 */

// Check for record
$check_sql = "SELECT id FROM projetos WHERE (id_proponentes = '{proponente}') AND (status = 'Submetido')";
sc_lookup(rs, $check_sql);

if (count({rs}>1))     // Row found
{
    sc_error_message('Este proponente já submeteu o máximo de projetos permitidos.');
}

Só que agora aparece o erro quando submete o primeiro projeto, mas submete…se eu for submeter o segundo aparece o erro, mas submete do mesmo jeito. O que eu quero é q só consiga submeter um, ou seja, dê o erro mas não submeta (validar)

Isso está no onValidate?

Depois do sc_error_message(), adicione: sc_error_exit();

Então, adicionei sc_error_exit() e agora não submete nada. Aparece o erro de cara e não submete… vou revisar o código todo e verificar se tem alguma outra coisa errada. É um form de controle com dois campos apenas que altera o status do projeto na tabela de Em inscrição para Submetido.

agredito que voce deveria especificar qual campo para contagem e nao todos da tabela:

SELECT COUNT(*)

Atenciosamente Arquimedes

No controle faça assim:

  • No onValidate você coloca o que você vai verificar. E feche com sc_error_exit();

  • No onValidateSuccess você coloca o update, redirecionamento, seja lá o que você quer fazer.

Pois ai nunca chegará no Update se as suas verificações não forem verdadeiras.

Guto,

Você tem certeza que isto está certo?

 if (count({rs}>1))

Porque o COUNT só está sendo fechado DEPOIS da condição, quando deveria ser fechado ANTES. talvez seja por ai o problema.

Sim, vou reorganizar o código dessa forma…deve ser isso sim.

É verdade… não tá certo não

Eu acho o seguinte:
a) deve haver a contagem no proponente. É isso?
b)contagem deve ser feita na sql.

conforme isso fiz o codigo abaixo e espero ter ajudado.

sc_lookup(rs,“SELECT count(id_proponentes) FROM projetos WHERE (id_proponentes = ‘{proponente}’) AND (status = ‘Submetido’”);
if(!empty({rs}))
{

$qtd_projetos_prop= {rs}[0][0];

}

if ($qtd_projetos_prop >=1 )
{
sc_error_message(‘Este proponente já submeteu o máximo de projetos permitidos.’);

}

Atenciosamente Arquimedes

Eu acho que a questão não é como se faz o count, sql ou via código, a questão é onde distribuir os códigos em eventos. Uma estrutura boa de se seguir em controle, é o exemplo do login, onValidate e onValidateSuccess, como eu disse anteriormente.

Com certeza vc esta certo em parte, pois se nao colocar a chamada em um envento correto o script nao ira funcionar corretamente ou nao ira funcionar, porém de nada adiante colocar ele no lugar certo e o algoritimo errado.

Att Arquimedes

Reorganizei o código todo, tinham algumas coisas no OnValidate que deveriam estar em OnValidateSucess. Tudo que está em onValidateSucess está funcionando.

Coloquei no OnValidate o código, conforme me indicaram:

/**
 * Recuperando o número de projetos submetidos do proponente
 */
$check_sql = "SELECT COUNT(id_proponentes)"
   . " FROM projetos"
   . " WHERE id = '" . {proponente} . "' AND status = 'Submetido'";

sc_lookup(rs, $check_sql);

if (!empty({rs}))
   {
      $qtd_projetos_prop = {rs[0][0]};
   }

if ($qtd_projetos_prop > 1)     
	{
       sc_error_message('Este proponente já submeteu o máximo de projetos permitidos.');
 	}

Rodei a aplicação em modo debug e esse sql é executado normalmente sem apresentar nenhum erro. Porém, não acontece o erro. Submeto o primeiro projeto de determinado proponente, aí ele muda o status do projeto para “Submetido”, tudo normal. Ao tentar submeter um segundo projeto para o mesmo proponente, como ele já submeteu um, deveria ser apresentado o erro, mas isso não ocorre e ele consegue submeter um segundo, um terceiro, quantos quiser.

Alguém mais tem uma ideia? Por favor e obrigado mais uma vez pela atenção de todos.