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.
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.
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.
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.
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.
2 respostas em “Simplificando as Macros SC_LOOKUP e SC_SELECT”
Ola, fiz do jeito que mostra no videio e nao mostra o resultado.
$sql = ‘SELECT
CODIGO,
FISICA_JURIDICA,
NOME,
ENDERECO,
NUMERO,
BAIRRO,
ID_CODCIDA,
CIDADE,
UF,
CEP,
FONE,
DATA_FICHA
FROM
acadclie’;
$clientes = lw_lookup($sql);
//sc_select(ds, $sql);
// echo ”;print_r($clientes);echo ”;
foreach($clientes as $cli) {
extract($cli);
echo ”;print_r($cli[‘nome’]);echo ”;
// echo ‘Nome:’ .$cli[‘nome’]
// . ‘Telefone: ‘ . $cli[‘fone’]
// . ‘Nascimento: ‘
// . date(‘d/m/Y’, strtotime($data_ficha));
}
Me chama no WhatsApp e manda o print.