Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

MarceloBezerra

[Resolvido] Programa UNI-usuário

Recommended Posts

Tenho um programa de cadastro de proposta comercial, são quatro operadores utilizando tal programa, porem tal programa não pode ser usado por dois ou mais usuários de uma só vez.

 

Pergunta: existe alguma função do php para limitar o uso desse programa para um único usuário por vez??

 

 

motivo: dois usuários ou mais usando o programa simultaneamente esta gerando duplicidade no nº da proposta...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você está gerando o número da proposta?

 

Select do último registro, somando +1 e incluido.

 

if(!empty($nwprop))
	{
	// Gerando número de proposta
	$sql = "SELECT codproc FROM tb_processo ORDER BY id_processo DESC LIMIT 1";
	$rqry = mysql_query($sql)or die (mysql_error());
					while($r=mysql_fetch_array($rqry)){
 								foreach($r as $varname=>$varvalue){
   						        $$varname = $varvalue;
									}
				}

					$ano=substr(date('Y'),3,1);
					$mes=date('m');
					$n=substr($codproc,5,2);
					$na=$n+1;
					$rev=0;
					$nprop = "P-".$ano.$mes.$na.$rev;

	}
		///incluindo proposta
				if (!empty($cadprop)){
					$cliente = $_POST['cliente'];
					$solicitante = $_POST['solicitante'];
					$descricao = $_POST['descricao'];		
					$dataini = $_POST['dataini'];	
					$datafim = $_POST['datafim'];
		//convertendo formato de datas para YYYY-mm-DD
					$anoini=substr($dataini,6,4);
					$mesini=substr($dataini,3,2);
					$diaini=substr($dataini,0,2);
					$dataini = $anoini."-".$mesini."-".$diaini;
					$anofim=substr($datafim,6,4);
					$mesfim=substr($datafim,3,2);
					$diafim=substr($datafim,0,2);
					$datafim = $anofim."-".$mesfim."-".$diafim;
					$status = "Analise Técnica";	
					$operador=$_SESSION["nome"];

					$sql=" INSERT INTO tb_processo (codproc, cliente, solicitante, descricao, 		data_ini, data_fim, status, optec) VALUES ('$codproc','$cliente','$solicitante','$descricao','$dataini','$datafim','$status','$operador')";
					mysql_query($sql)or die (mysql_error());
?>
<script language="javascript">
window.close();
</script>
<?

					}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não seria melhor usar mysql_insert_id() ?

O problema e o nº da proposta tem sua estrutura própria:

 

 

P-YMMNNR

 

onde

P = Proposta (constante);

Y = O último digito do ano Ex 2011 Y=1;

MM= Mes Ex. março = 03;

NN = Número da proposta 01 a 99;

R = número de revisão da proposta sendo 0 original, 1 rev.1, 2 rev.2 e assim por diante até 9

 

 

portanto . P105130 (original ou proposta inicial) P105131 (revisão 1),

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem cada usuário registrado no banco de dados e cada um deles tem um identificador, certo? Então é só voce acrescentar esse identificador de usuário ao número identificador das propostas.

 

Exemplo:

P-UUYMMNNR

 

UU => Número de identificação do usuário.

 

 

Ou a lógica do seu sistema não permite isso e as propostas tem de ser impessoais?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem cada usuário registrado no banco de dados e cada um deles tem um identificador, certo? Então é só voce acrescentar esse identificador de usuário ao número identificador das propostas.

 

Exemplo:

P-UUYMMNNR

 

UU => Número de identificação do usuário.

 

 

Ou a lógica do seu sistema não permite isso e as propostas tem de ser impessoais?

é uma adéia, quanto a lógica tudo bem, o problema e convencer a diretoria de mudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, então eu sugiro LOCK TABLES para impedir a escrita

 

Quando um usuário inicia uma seção, tranque a tabela 'propostas'

mysql_query("LOCK TABLES propostas WRITE;");

 

Não sei como você está gerenciando a sessão com o usuário, mas suponho que você possa identificar pela hora do acesso o usuário que tem a preferencia em inserir a proposta.

 

Para destravar a tabela e inserir a proposta:

mysql_query("UNLOCK TABLES; INSERT INTO propostas (...) VELUES (...);"); 

 

Não sei se vai dar certo, faça os testes aí.

 

Outra maneira seria usar uma tabela no banco de dados que armazenaria o nome e a data do acesso do usuário e no script você garantia que nos próximos 15 minutos (por exemplo) apenas esse usuário poderia escrever na tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, então eu sugiro LOCK TABLES para impedir a escrita

 

Quando um usuário inicia uma seção, tranque a tabela 'propostas'

mysql_query("LOCK TABLES propostas WRITE;");

 

Não sei como você está gerenciando a sessão com o usuário, mas suponho que você possa identificar pela hora do acesso o usuário que tem a preferencia em inserir a proposta.

 

Para destravar a tabela e inserir a proposta:

mysql_query("UNLOCK TABLES; INSERT INTO propostas (...) VELUES (...);"); 

 

Não sei se vai dar certo, faça os testes aí.

 

Outra maneira seria usar uma tabela no banco de dados que armazenaria o nome e a data do acesso do usuário e no script você garantia que nos próximos 15 minutos (por exemplo) apenas esse usuário poderia escrever na tabela.

 

vou tentar e posto aqui em seguida...VLW

 

PS. demorei para postar, tenho só duas horas por semana de desenvolvimento... do sistema

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei uma forma: ISSO ESTA EM POUP-UP

 

A) Quando o primeiro usuário acessar o programa, no banco é incluido uma letra "X" no campo "em_uso" do último registro na tabela do registro da proposta.

 

Quando é registrado uma nova proposta tal campo é =NULL. <-- serve de condição para registrar uma nova proposta.

 

Caso o usuário cancele o registro antes de submete-lo, uso o jquery para alterar o campo "em_uso" para NULL novamente.

 

O problema é:? eu não tenho como impedir que o usuário feche a janela em (x) do navegador?

 

Pergunta: Tem como desativar o (x) do navegador via JS? NÃO! pelo que ja pesquisei.

 

Sei quem tem outra forma usando um tipo de janela sobreposta ao navegador (geralmente utilizado em imagens) porem não trabalhei com isso ainda.

 

Tem como me ajudar!!!

 

Achei uma forma: ISSO ESTA EM POUP-UP

 

A) Quando o primeiro usuário acessar o programa, no banco é incluido uma letra "X" no campo "em_uso" do último registro na tabela do registro da proposta.

 

Quando é registrado uma nova proposta tal campo é =NULL. <-- serve de condição para registrar uma nova proposta.

 

Caso o usuário cancele o registro antes de submete-lo, uso o jquery para alterar o campo "em_uso" para NULL novamente.

 

B) O problema é: como eu não tenho como impedir que o usuário feche a janela em (x) do navegador?

 

Pergunta: Tem como desativar o (x) do navegador via JS? NÃO! pelo que ja pesquisei.

 

Sei quem tem outra forma usando um tipo de janela sobreposta ao navegador (geralmente utilizado em imagens) porem não trabalhei com isso ainda.

 

Tem como me ajudar!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

RESOLVIDOOOOOOO!

 

 

Resolvi da segunte forma:

 

Quando o usuário acessa o módulo de registro de proposta o codigo coloca um "s" no campo ativo da tb_proposta.

 

Este capo serve como condição para o usuário continuar no módulo.

 

Caso a tabela estiver com o campo ativo=s : Exibe mensagem em JS (ALERT)

 

Quando o 1º usuário terminar de registrar a proposta , o último registro é gravado com ativo=NULL, liberando para-o para o 2º usuário.

 

Caso o 1º cancele a operação, no botão "cancelar" chama um script em Jquery que altera o campo ativo do último registro para NULL.

 

E pronto. Testado e aprovado. :clap:

 

 

regprop.php

 

if(!empty($nwprop))

{

// Gerando número de proposta

$sql = "SELECT codproc,ativo FROM tb_processo ORDER BY id_processo DESC LIMIT 1";

$rqry = mysql_query($sql)or die (mysql_error());

while($r=mysql_fetch_array($rqry)){

foreach($r as $varname=>$varvalue){

$$varname = $varvalue;

}

}

 

if ($ativo=="s"){

echo"<script LANGUAGE=\"Javascript\">

alert(\"Registro de proposta ocupado - Tente mais tarde!\");

close();

</SCRIPT>";

}

$sql= ("UPDATE tb_processo SET ativo='s' WHERE codproc='$codproc'");

mysql_query($sql);

$ano=substr(date('Y'),3,1);

$mes=date('m');

$n=substr($codproc,5,2);

$na=$n+1;

$rev=0;

$nprop = "P-".$ano.$mes.$na.$rev;

 

///incluindo proposta

if (!empty($cadprop)){

$cliente = $_POST['cliente'];

$solicitante = $_POST['solicitante'];

$descricao = $_POST['descricao'];

$dataini = $_POST['dataini'];

$datafim = $_POST['datafim'];

//convertendo formato de datas para YYYY-mm-DD

$anoini=substr($dataini,6,4);

$mesini=substr($dataini,3,2);

$diaini=substr($dataini,0,2);

$dataini = $anoini."-".$mesini."-".$diaini;

$anofim=substr($datafim,6,4);

$mesfim=substr($datafim,3,2);

$diafim=substr($datafim,0,2);

$datafim = $anofim."-".$mesfim."-".$diafim;

$status = "Analise Técnica";

$operador=$_SESSION["nome"];

$sql="INSERT INTO tb_processo (codproc, cliente, solicitante, descricao, data_ini, data_fim, status, optec) VALUES ('$codproc','$cliente','$solicitante','$descricao','$dataini','$datafim','$status','$operador')";

mysql_query($sql)or die (mysql_error());

echo"<script language=\"javascript\">window.close();</script>";

}

}

?>

<script type="text/javascript" src="jquery.js"></script> // baixar o arquivo no jquery

<script>

function desmarca(inputString) {

if(inputString.length == 0) {

$('#suggestions').hide();

}

else {

$.ajax(

{

type: "POST", url: "dstv.php"

}

)

window.close()

 

}

}

</script>

 

<form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?codproc=<?php echo $nprop;?>&cadprop=1">

 

(...)

<input name="cliente" type="text" id="cliente" size="30" maxlength="30" />

(...)

<input type="reset" name="cancela" id="cancela" value="Cancelar" onClick="desmarca(this.value);">

<input type="submit" name="Criar Proposta" id="Criar Proposta" value="Criar Proposta" />

</form>

 

 

 

Arquivo DSTV.php

 

<?php

include("includes/conn.php");

$sql= ("UPDATE tb_processo SET ativo=NULL");

mysql_query($sql);

echo"<script language=\"javascript\">window.close();</script>";

 

?>

 

 

:P :P :P :joia: :joia: :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sei que resolveu mas eu estava aqui pensando...

 

Já normal e nativamente as informações de sessão são gravadas em disco no servidor, elas são comuns à todos os browsers, certo?

 

Com isso em mente podemos deduzir que diferentes browsers, mesmo que no mesmo PC é o mesmo múltiplos browsers em diferentes computadores, certo?

 

Sendo assim, e supondo que haja uma autenticação envolvida e que a mesma se baseie por sessões, porque não usar a própria sessão para condicionar a autenticação única OU valer-se da mesma idéia para, se for o caso, que múltiplos usuários logados ao mesmo tempo cadastrem as prpostas um de cada vez?

 

Pensa bem, se antes de a autenticação for efetivada você condicionar a existência de determinada informação em $_SESSION antes de todo o processo de fato, não daria certo também?

 

Algo como:

 

if( isset( $_SESSION['auth'] ) ) {

   throw new Exception( 'Já existe outro usuário autenticado' );

} else {

   // Faz o login
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já normal e nativamente as informações de sessão são gravadas em disco no servidor, elas são comuns à todos os browsers, certo?

não, incorreto.

Para cada browser de um mesmo computador, você abre uma instancia diferente de navegação.

 

Essa tua suposição é inverdade.

 

 

Com isso em mente podemos deduzir que diferentes browsers, mesmo que no mesmo PC é o mesmo múltiplos browsers em diferentes computadores, certo?

não entendi nada, mas por lógica, já que essa frase se baseia em uma premissa falsa, então essa tb é falsa.

 

 

 

if( isset( $_SESSION['auth'] ) ) {

   throw new Exception( 'Já existe outro usuário autenticado' );

cuidado rapaz.. não é para isso que existem as Excessões.

 

 

@topic

motivo: dois usuários ou mais usando o programa simultaneamente esta gerando duplicidade no nº da proposta...

não era mais simples, ter um campo autoincrement para ser o numero da proposta ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
@topic
motivo: dois usuários ou mais usando o programa simultaneamente esta gerando duplicidade no nº da proposta...
não era mais simples, ter um campo autoincrement para ser o numero da proposta ?

Pois é, seria, mas esse formato de numeração (P = proposta 1= último dígito do ano, 03=mês, 02=número de proposta e 0=número da revisão), foi definido pela diretoria (sem nenhuma possibilidade política de alteração)!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.