Categorias
Dicas

Simplificando as Macros SC_LOOKUP e SC_SELECT

Existem duas formas de fazer acesso aos dados do banco de dados no Scriptcase: Usando as macros sc_lookup e sc_select. Vamos aprender uma forma simplificada de manipular estes dados do banco com uma função que eu criei para usar nos meus projetos: lw_lookup.

Exemplo:

Para exemplificar a aplicação das macros vamos supor que queremos uma listagem com o nome, telefone e nascimento dos clientes.

Exemplo de listagem de clientes com telefone e nascimento

Para criar este exemplo usaremos uma aplicação blank do Scriptcase onde será aplicada a tag HTML <h2> para o nome e uma quebra <br> para o Nascimento.

Usando a macro sc_lookup

Para usar a macro sc_lookup do Scriptcase você tem a seguinte sintaxe:

sc_lookup(Dataset, “Comando SQL”, “Conexão”);

Dataset é um array bidimensional com o índice das colunas e linhas definido.

Neste exemplo vamos fazer um SELECT na tabela de cliente usando sc_lookup.

$sql = 'SELECT 
		cliid,
		clistatus,
		clinome,
		clitel,
		cliemail,
		clinasc,
		cliempresa,
		clicep,
		cliobs,
		clilogo
	FROM
		cliente';
sc_lookup(ds, $sql);

for ($i = 0; $i < count({ds}); $i++) {
	echo '<h2>' . {ds[$i][2]}
		. '</h2>Telefone: ' . {ds[$i][3]}
		. '<br>Nascimento: ' 
		. date('d/m/Y', strtotime({ds[$i][5]}));
}

Observe que usando a sc_lookup para acessar os registros é necessário indicar o número da linha e coluna.

Por exemplo, para acessar o telefone é necessário fazer:

{ds[$i][3]};

Quando se faz um select com muitas colunas a gente precisa contar para saber exatamente qual é o índice referente a coluna desejada.

Eu já fiz isso muito até apliquei “aquela velha técnica japonesa” de colocar os dois primeiros campos na linha 1 do código mas não funciona quando o select está no meio do código.

Associando o número da linha com a posição do campo

Já usei muito isso sempre pensando que deveria ter uma forma mais simples de fazer esta associação.

Usando a macro sc_select

Para ter o mesmo resultado com sc_select é necessário fazer o while no dataset e conferir se houve erro.

$sql = 'SELECT 
			cliid,
			clistatus,
			clinome,
			clitel,
			cliemail,
			clinasc,
			cliempresa,
			clicep,
			cliobs,
			clilogo
		FROM
			cliente';
sc_select(ds, $sql);

if ( {ds} === false ) {
	echo "Erro de acesso. Mensagem = " . {ds_erro};
} else {
	while (!{ds}->EOF) {
		echo '<h2>' . {ds}->fields[2]
			. '</h2>Telefone: ' . {ds}->fields[3]
			. '<br>Nascimento: ' . date('d/m/Y', strtotime({ds}->fields[5]));
    	{ds}->MoveNext();
	}
  	{ds}->Close();
}

Neste caso para acessar o mesmo telefone temos duas opções:

echo {ds}->fields[3];            // ou
echo {ds}->fields['clitel'];

A segunda opção é mais amigável, mas de qualquer forma o seu código ficará poluído com um if e um while que não tem relação direta com a regra de negócio a ser implementada.

Penso que esse tratamento deveria estar separado do meu código principal.

Por isso criei a função lw_lookup() veja a diferença e como melhora a legibilidade do código.

Função lw_lookup

A grande diferença é que aqui eu manipulo os dados com base no nome do campo da tabela. Eu tenho um array bidimensional com cada nome.

$sql = 'SELECT 
			cliid,
			clistatus,
			clinome,
			clitel,
			cliemail,
			clinasc,
			cliempresa,
			clicep,
			cliobs,
			clilogo
		FROM
			cliente';
$clientes = lw_lookup($sql);

Veja por exemplo um print_r deste array.

Array da função lw_lookup
Array da função lw_lookup

Se você quiser simplificar ainda mais o acesso aos dados você pode dar um extract aqui dentro do foreach. Vou criar um alias para os campos que eu usei aqui no exemplo.

$sql = 'SELECT 
			cliid,
			clistatus,
			clinome,
			clitel,
			cliemail,
			clinasc,
			cliempresa,
			clicep,
			cliobs,
			clilogo
		FROM
			cliente';
$clientes = lw_lookup($sql);
foreach($clientes as $cli) {
	extract($cli);
	echo '<h2>' . $clinome
		. '</h2>Telefone: ' . $clitel
		. '<br>Nascimento: ' 
		. date('d/m/Y', strtotime($clinasc));
}

Acessando diretamente o registro ou campo da tabela

Veja um exemplo simples em que a função vai permitir acessar o campo em apenas uma linha:

$nome = lw_lookup("SELECT clinome FROM cliente WHERE cliid = 1")[0]['clinome'];

Código da função lw_lookup

Para utilizar a função lw_lookup vá em ferramentas, bibliotecas internas, bibliotecas públicas e clique em nova para criar uma nova.

Criando uma nova biblioteca interna
Criando uma nova biblioteca interna

Informe o nome do arquivo “lwLookup.php”, a descrição “Criando uma nova biblioteca interna”.

Cole o código a seguir:

<?php
function lw_select( $pdo ) {
	$arrSelect = array();
	if($pdo) {
		while (! $pdo -> EOF) {
			$arr = $pdo -> fields;
			$campos = array_filter($arr, function($k) {
				return (! is_int($k));
			}, ARRAY_FILTER_USE_KEY);

			$arrSelect[] = $campos;
			$pdo -> MoveNext();
		}
		$pdo -> close();
	}
	return $arrSelect;
}

function lw_lookup($sql) {
	sc_select(ds, $sql);
	$res = lw_select({ds});
	return $res;
}
?>

Aqui temos duas funções: a lw_select que faz a mágica acontecer e a lw_lookup que foi usada nos exemplos acima.

A parte principal da lw_select é a função do PHP array_filter que retorna somente os índices do array $pdo->fields que não são inteiros.

Praticamente ela dá uma limpa no array de retorno do sc_select.

Já a função lw_lookup apenas usa o sc_select para acessar o dataset bruto chama o lw_select para fazer a limpeza.

Conclusão

Como a função é baseada na macro do Scriptcase sc_select a gente tem ótima compatibilidade, inclusive com o modo debug ativado funciona perfeitamente.

Prezo muito pela legibilidade do código pois você vai precisar dar manutenção no código e se o código estiver limpo você tem muito mais facilidade.

Essa foi a nossa dica de hoje. Comente aqui se foi útil para você.

Um abraço e até a próxima.

Categorias
Dicas

Como Ocultar Alguns Checkboxes Numa Consulta do Scriptcase

Neste tutorial eu mostro como ocultar o checkbox de apenas algumas linhas da consulta que tem o botão Run.

Este não é um recurso nativo do Scriptcase mas com um pouco de conhecimento você pode deixar suas grids muito mais intuitivas.

Tutorial

Assita ao vídeo com o tutorial completo

Vamos ao passo a passo.

1. Inspecione o elemento

Inspecionar: clique com botão direito no checkbox.

Clique com o botão direito sobre um dos checkboxes, exceto o checkbox de marcar todos, e vá na opção inspecionar.

Inspecionar checkbox.

No id você vai encontrar algo parecido com NM_ck_run3 onde o número no final corresponde ao número sequencial da linha.

2. Crie as Variáveis Globais

No evento OnScriptInit da consulta você vai criar mais duas variáveis globais:

[gROW] = 0;[gIDS] = [];

A primeira para armazenar o número sequencial da linha e a segunda para armazenar o id do checkbox da linha.

3. Incrementar a Linha e Verificar Se Está Ativo

No evento onRecord da consulta você vai precisar primeiro incrementar a variável global [gROW]:

[gROW]++;

Na sequência verifique se o status é inativo com um if.

Atribua a um novo índice do array global [gIDS] o id do elemento concatenado ao número da linha da global [gROW].

Lembre-se de acrescentar o # antes.

if({clistatus} == 'Inativo') {
	[gIDS][] = "#NM_ck_run" . [gROW];
}

4. Ative o Rodapé na Consulta

Ativando a exibição do rodapé.

Ative o rodapé apenas para que o código onFooter seja executado.

5. Ocultar os Ids Via CSS

No método onFooter você vai implodir o array de ids [gIDS] separados por vírgula atribuindo a uma varíável $chIds.

$chIds = implode(',', [gIDS]);

Você terá na variável $chIds todos os elementos do array separados por vírgula.

Agora basta usar o CSS para aplicar o display: none nestes elementos.

echo "<style>$chIds {display:none}</style>";

A função echo serve apenas para mandar este código para o navegador.

A tag HTML <style> indica que vamos trabalhar com o CSS e o atributo display: none oculta efetivamente o checkbox.

Conclusão

De uma forma simples você pode melhorar a usabilidade do sistema impedindo que registros indesejados sejam selecionados na consulta.

Agora escreva aqui nos comentários se a dica foi útil.

Um abraço e até a próxima.