[RESOLVIDO] Como criar atributos da aplicação via código?

Bom dia,

Estou querendo criar atributos iguais aos que são criados acessando Aplicação > Programação > Atributos, só que via código, alguém sabe como proceder?

Eu tentei criar da mesma forma que o Scriptcase, mas na hora de ler o atributo ele não encontra, exemplo:

$_SESSION[‘frm_tabela_comercial’][‘attr_nm_documento’] = array(); e depois echo {attr_nm_documento}.

$this->Nome=“123”;

ou

[Nome]=“123” (desabilite get, post e session e habilite cmo saida).

São duas formas que eu utilizo.

Blz Haroldo, vlw!

Enquanto tava aguardando as respostas, tbm cheguei a mesma conclusão que vc.

Acho essa maneira mais pratica do que fazer pela interface do Scriptcase.

Haroldo bom dia.
Aproveitando esse post que você fez, gostaria de tirar uma dúvida.
Tenho um formulário que tem um campo número-autocomplete, que após selecionado um cliente, ele seta uma variável do tipo “session”. Ao lado desse campo tenho um outro campo do tipo Imagem-HTML que liga a um Controle (cadastro do cliente). Nele a ligação é feita com base nesse código que é alimentado no evento ajax… Onde está o problema: Ocorre que quando se carrega a outra tela, está carregando dados de outra pessoa. Creio que seja lixo, mas é tudo por variável.
Aí vendo esse post seu… Você diz para não utilizar nenhuma das 3 opções. e somente marcar como saída… seria um variável direta… que não teria como ficar lixo em memória?
Pois sempre temos dúvidas quanto a esses 3 tipos: Session, Post e Get.
Poderia me esclarecer essa situação ou melhor forma de uso… ou até mesmo se você já faze algum post…poderia me indicar… não encontrei nada aqui que fosse bem claro, e suas utilizações sempre são ótimas.
Obrigado

As váriáveis se manterão em sessão de qualquer forma. O Scriptcase carrega (exageradamente a sessão do PHP), infelizmente. As globais que você utiliza devem ser poucas em relação as que o SC utiliza. Tem um opção que é usar a sessão em banco de dados, mas não sei até onde isso funciona bem realmente (já tive problemas no passado e acabei desistindo de usar, depois não tentei mais) e se não degrada o sistema.

Ok, mas esse tipo de problema acontece mesmo. De carregar informações que são antigas pelo lixo dessas variáveis…
Mas em ligações, sempre é bom usar como post ou get e não como sessão para não ter esse tipo de problema?
Com você acontece esse tipo de problema?

Falo isso por que ligação de campos direto, não temos problemas… mas quando são passagens de parâmetros… sempre ocorre, volte meia.
Exemplo: Consulta e formulário ligado por campo id não tem erro…mas quando ligamos por controle ou mesmo chamamos o formulário com o parâmetro, as vezes ocorre esses erros.

Acho que por GET não aconselho, mas por POST sim.
Eu sempre destruo as globais que utilizo depois do uso, principalmente aquelas que tem dados importantes ao sistema.
E também uso meu próprio esquema de sessão e em banco de dados.

<?php
//__NM__Sessào Seriallizada__NM__FUNCTION__NM__//
Function MySession($mysession_key,$mysession_value="",$mysession_action="R") {
/*
MySession("nome_variavel","Valor do campo"); ->Cria a variavel em sessão 
$Variavel=MySession("nome_variavel"); retorna o valor da variavel em sessão 
MySession("nome_variavel",,"D"); ou MySession("nome_variavel","~D");->Exclui Variavel da sessão
MySession(,,"D"); ou MySession("~D");->Limpa todas variaveis da sessão
Na virada do dia todas sessões do dia anterior são exclusas
By Haroldo Passos 17/05/2011 
Atualizada em: 14/10/2014
*/
if (!empty($mysession_value)&&$mysession_value<>"~D") {
	$mysession_value=serialize(is_array($mysession_value)?$mysession_value:Array($mysession_value));
}
IF (ISSET($_REQUEST['PHPSESSID'])) $_PHPSESSID=@$_REQUEST['PHPSESSID'];  
IF (!ISSET($_PHPSESSID)||EMPTY($_PHPSESSID)) $_PHPSESSID=session_id(); 

If (!Empty($mysession_value)&&$mysession_value<>"~D") {$mysession_action="W";}
If ($mysession_action=="W" && !Empty($mysession_value)) {
sc_exec_sql("DELETE FROM mysession WHERE (id='$_PHPSESSID' AND chave='$mysession_key') OR DATE(timestamp)< CURRENT_DATE");
sc_exec_sql("INSERT INTO mysession (id,chave,valor) VALUES ('$_PHPSESSID','$mysession_key','$mysession_value')");
}
If ($mysession_action=="D" or $mysession_value=="~D" or $mysession_key=="~D") {
  $mysession_action="D";
  If (!Empty($mysession_key) && $mysession_key!="~D") 
  {sc_exec_sql("DELETE FROM mysession WHERE (id ='$_PHPSESSID' AND chave ='$mysession_key') OR DATE(timestamp)< CURRENT_DATE");}
  Else {sc_exec_sql("DELETE FROM mysession WHERE (id ='$_PHPSESSID') OR DATE(timestamp)< CURRENT_DATE");} 
}
If ($mysession_action=="R"&& empty($mysession_value) && !Empty($mysession_key)) {
 sc_lookup(mysession_ds,"Select valor from mysession where id='$_PHPSESSID' and chave='$mysession_key'");
 If (!Empty({mysession_ds})) {
	 $_ds=unserialize({mysession_ds[0][0]});
    // echo $_ds."<--<br>";
 	//echo unserialize($_ds)."<--<br>";
	 if (count($_ds)==1) $_ds=$_ds[0];
	 return $_ds;
 }
	
}
}
?>
  • Hoje é um biblioteca interna, mas devo transforma-la em externa e trocar serialize por json e também usar engine ARIA no lugar de MEMORY e manter os valores por 1 semana, para poder debugar quando necessário.

Utilizo uma tabema com engine Memory com 3 campos: id, chave, valor:

CREATE TABLE `mysession` (
	`ID` CHAR(32) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
	`CHAVE` VARCHAR(30) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
	`VALOR` VARCHAR(2024) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
	`TIMESTAMP` TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
	PRIMARY KEY (`ID`, `CHAVE`) USING HASH
)
COLLATE='utf8_general_ci'
ENGINE=MEMORY
ROW_FORMAT=COMPRESSED
;
1 Curtida

Obrigado pela explicação.
Sempre nos ensinando.

Uma outra forma que uso em um sistema meu e tem se comportado bem é usar uma classe básica do php em uma sessão e ir adicionando atributos nela.

Global de Sistema

  • Váriáveis Globais: Sessão: Sim, Get e Post: Não, Saída: Sim.

No login:
onAppInit:
[iwg] = new StdClass; //[iwg] é sessão, e g de global.

na onvalidate:

[iwg]->login = $usr_login;
[iwg]->empId = $empresaCodigo;
[iwg]->usrNome = $nomeUsuario;
[iwg]->empNome = $nomeEmpresa;

Em todas demias aplicações nunca atribulo valor ara essa global, apenas uso com litura

Global de Ligação

  • quando quero passar parâmetros:

app chamadora:
[iwl] new stClass;
[iwl]->clienteId = {clienteId};

app chamada:

echo [iwl]->clienteId; //iwl -> L de ligação
unset([iwl]); //sempre destruo global de ligação de pois de usar.

Global de uso local (apenas dentro da própria app)
onAppInit: /Variáveis Globais: Sessão:Não, Get: Não, Post:Não, Opcional:Sim, Saída:Sim

[iw] = new stdClass; //só iw é uma gobal local.
[iw]->counter =0

nos eventos:

[iw]->counter++;
echo [iw]->counter;

iw -> é uma sigla que uso padrão minha (InfinitusWeb).

Aqui penso em criar uma Biblioteca externa que terá uma flag Degug, que se ativa fica gravando em banco de dados todas as [iw`*´] com seus valores atribuídos em cada evento , para analise dos dados em sessão no tempo através de relatórios para avaliar possíveis falhas do sistema.

1 Curtida

Boa tarde Haroldo.
legal essa sugestão. Meio que trabalhamos assim também. Mas a ideia de trabalhar com a variável de sessão no banco, ainda mais tendo a opção do mysql de ter uma tabela do tipo Memory, desse jeito não vejo margem para erro de lixo em memória da variável, e sim somente no momento de gerar esses valores, mas são processos simples… Acho que essa seria a solução mais adequada, uma vez que para sua utilização não teríamos variações…
Obrigado mais uma vez.

Esse esquema de global é muito interessante.
Tenho que criar vergonha na cara para implementar nas minhas APP.
Facilita a vida.