Sugestão: sc_lookup e sc_select (trocar numero da coluna por nome da coluna

$this->Db->SetFetchMode(ADODB_FETCH_ASSOC); // isso para a conexão padrão, trocaria o índice do array do result set de numérico para o nome da coluna do select.

$this->Db->SetFetchMode(ADODB_FETCH_ASSOC)
sc_lookup(ds,“Select nome from clientes”);

echo $ds[0]['nome]; funcionaria se o sc_lookup e sc_select internamente não forçasse o índice do array numerico…
Fica como sugestão:

sc_lookup(ds,“select…”,conexão, “ASSOC”) o mesmo para o sc_select, retornando em vez do número da coluna o nome da mesma.

ou atribuir uma propriedade de retorno que obtivesse o nome das colunas como valor com índice sendo o número da mesma.

sc_lookup(ds,“Select…”);
print_r($_nm_column’);
onde $_nm_column[0] = nome da coluna 1 do select assim por diante.

Criei uma biblioteca (Só funciona para conexão padrão):

<?php
Function my_lookup($nm_select,$_mode="ASSOC") {
  if ($_mode=="ASSOC") { $this->Db->SetFetchMode(ADODB_FETCH_ASSOC); }
  $_SESSION['scriptcase']['sc_sql_ult_comando'] = $nm_select;  
  $_SESSION['scriptcase']['sc_sql_ult_conexao'] = '';  
  $ds = array(); 
  if ($rx = &$this->Db->Execute($nm_select))  
        {   
           $y = 0;  
           $nm_count = $rx->FieldCount(); 
           while (!$rx->EOF) 
           {   
                 if ($_mode<>"ASSOC") {
                    for ($x = 0; $x < $nm_count; $x++) 
                    {   
                       $ds[$y] [$x] = $rx->fields[$x]; 
                    }
                  }else{ $ds[$y] = $rx->fields; }  
                  $y++;  
                  $rx->MoveNext(); 
           }  
           $rx->Close(); 
       }  
       elseif (isset($GLOBALS["NM_ERRO_IBASE"]) && $GLOBALS["NM_ERRO_IBASE"] != 1)   
       {   
           $ds = false; 
           //$ds_erro = $this->Db->ErrorMsg(); 
       } 
       
       $this->Db->SetFetchMode(ADODB_FETCH_NUM); 
       Return $ds;
}
?>

$_ds=my_lookup(“Select * from funcionarios”,“ASSOC”);
print_r($_ds);
unset($_ds);

sc_lookup(ds,“Select * from funcionarios”);
echo "

" ;

print_r($ds);

TAGS: Column , Name, Nome Coluna Select SQl sc_lookup sc_select

IRADO HAROLDO, com isso se não me engano dá para deixar qualquer trabalho com os {campos} mais dinâmico, dentre outras possibilidades dinâmicas.

Ideal é se as macros já permitissem isso.

Vou tentar incluir agora o nome da conexão como parâmetro.

Haroldo nao é puxar o saco mas tu é o cara!

Melhoria na biblioteca

[code]<?php
//mode = ASSOC -> sc_select retornando indice de array como nome da coluna
//mode = NUM -> sc_select retornando indice de array numerico sequencial
//mode = LOOKUP_ASSOC -> sc_lookup retornando indice de array como nome da coluna
//mode = LOOKUP -> sc_lookup retornando indice de array como numerico sequencial
//conn = Vazio -> conexão atual ou o nome da conexão desejada, se for usar um nome de conexão,
// deve criar no evento on_script_init ou on_execute o camando c_select(xx,“Select 1”,“ConexãoNome”);
// para o sc criar as vãriãveis e funções para esta conexão
// Retorna Array com resultado ou com valor===False e $this->db_error=tipo de erro do banco
//Mais rápido que o sc_lookup e otimiza memória pelo fato de não guardar em variáveis globais

Function my_select($_select,$_mode=“ASSOC”,$_conn="") {
$_mode=$_mode==""?“ASSOC”:$_mode;
$_SESSION[‘scriptcase’][‘sc_sql_ult_comando’] = $_select;
$_SESSION[‘scriptcase’][‘sc_sql_ult_conexao’] = ‘’;
$_ds=array();
$_conn=$conn==""?’$this->Db’:’$this->Ini->nm_db’.trim($_conn);
IF (strtolower($_mode)==“assoc” || strtolower($_mode)==“lookup_assoc”)
{
eval($_conn.’->SetFetchMode(ADODB_FETCH_ASSOC);’);
}else
{
eval($_conn.’->SetFetchMode(ADODB_FETCH_NUM);’);
}
$_connexec=’$_ok=($_rx=&’.$_conn.’->Execute($_select));’;
eval($_connexec);
IF ($_ok)
{
IF ( strtolower($_mode)==“lookup_assoc” || strtolower($_mode)==“lookup”)
{
$_y = 0;
$_count = $_rx->FieldCount();
while (!$_rx->EOF)
{
IF (strtolower($_mode)==“lookup”)
{
for ($_x = 0; $_x < $_count; $_x++)
{
$_ds[$_y] [$_x] = $_rx->fields[$_x];
}
}ELSE
{
$_ds[$_y] = $_rx->fields;
}
$_y++;
$_rx->MoveNext();
}
$_rx->Close();
eval($_conn.’->SetFetchMode(ADODB_FETCH_NUM);’);
RETURN $_ds;
}ELSE
eval($_conn.’->SetFetchMode(ADODB_FETCH_NUM);’);
RETURN $_rx;
{
}
}ELSE
{
$_ds=False;
eval(’$this->db_error=’.$_conn.’->ErrorMsg();’);
eval($_conn.’->SetFetchMode(ADODB_FETCH_NUM);’);
RETURN $_ds;
}
}

?>[/code]:

Exemplo de utilização:

[code]sc_lookup(xx,“Select 1”,“Publico”);

echo “Conexão diferente da padrão simulando erro
”;

$_ds=my_select(“SELECT * FROM localidades limit 10”,“NUM”);
if ($_ds === false)
{
echo “Erro de acesso. Mensagem = “.$this->db_error.”
”;
}
else
{
while (!$_ds->EOF){
print_r($_ds->fields);echo “
”;
$_ds->MoveNext();
}
$_ds->Close();
}
unset($_ds);
echo "

Conexão diferente da padrão sc_select
";

$_ds=my_select(“SELECT * FROM localidades limit 10”,"",“Publico”);
if ($_ds === false)
{
echo “Erro de acesso. Mensagem = “.$this->db_error.”
”;
}
else
{
while (!$_ds->EOF){
print_r($_ds->fields);echo “
”;
$_ds->MoveNext();
}
$_ds->Close();
}

unset($_ds);

echo “

Conexão padrão sc_lookup
”;

$meus_dados=my_select(“SELECT id_func,codigo,nome FROM funcionarios limit 10”,“lookup”);

print_r($meus_dados);

echo “

Conexão padrão sc_lookup
”;

$meus_dados=my_select(“SELECT id_func,codigo,nome FROM funcionarios limit 10”,“lookup_assoc”);

print_r($meus_dados);

unset($meus_dados);[/code]

Na prática::

http://iw.servehttp.com:85/sc/iw/app/Publico/mostra_campos/mostra_campos.php?nmgp_outra_jan=true&nmgp_start=SC

1 Curtida

Obrigada, me ajudou aqui.

1 Curtida

Hoje utilizo essa classes como biblioteca externa, está num padrão mais moderno:

2 Curtidas

Ah legal, eu vou testar, certamente. Obrigada de novo.

Boa tarde Haroldo, essa sua classe funciona com a versão 5 do ScriptCase?
Se “sim”, você pode postar a forma de uso dela?
Agradeço antecipadamente.

Acredito que funcione sim, amanhã monto um exemplo.

Ok Haroldo,
Obrigado pela atenção!

Como o tópico original é de 2012, acredito funcionar sem problemas no SC 5.

Criar uma Biblioteca externa com o nome de Models como projeto
Dentro dela criar arquivo .php com nome de : ModelSample.class.php

<?PHP

/**
 * Classe Exemplo Models
 * Criada em 27/04/2022 por Haroldo
 */

namespace Models;

require_once dirname(__DIR__, 1) . '/ActionsMaster/class/IWDBMaint.class.php';

class ModelSample
{
    public function __construct($conn = null)
    {
        $this->db  = new \Actions\IWDBMaint($conn, ADODB_FETCH_ASSOC);
    }

    /**
     * Método razaoSocialByCnpj
     *
     * @param [type] $cnpjBasico
     * @return void
     * 
     */
    public function razaoSocialByCnpj($cnpjBasico)
    {
//Aqui use um select de uma tabela vállida do Banco de dados relacionado a conexão padrão do seu projeto
        $sql = "Select razao_social from erp_master.empresa where cnpj_basico = '$cnpjBasico'";
        $ds = $this->db->execute($sql);

        return $ds['razao_social'];
    }
}

Baixar a biblioteca Actions-Master em https://github.com/InfinitusWeb/Actions-Master

Criar Biblioteca Externa como nome ActionsMaster como projeto e importar o zip baixado do Git.

Criar uma blank de exemplo com o código abaixo no evento onExecute:

sc_include_library('prj','Models','ModelSample.class.php');

//$this->Db é o handle do objeto instanciado da sua conexão padrão
$db = new Models\ModelSample($this->Db);
$ds = $db->razaoSocialByCnpj('00000000');
echo '<pre>', print_r($ds,true), '</pre>';

TAGS: HAROLDO, BIBLIOTECA, EXTERNA, OOP, CLASSE, PHP, CONEXÃO, SC_LOOKUP, SC_SELECT, SC_EXEC_SQL, ASSOC, NOME COLUNA, BLANK, MODELS, REGRA, NEGÓCIO, CAMADA, ADODB, PDO

2 Curtidas

Obrigado Haroldo pela atenção!

1 Curtida