sc_lookup procurar pelo nome dos 'campos' na seleção.

No sc_select, conseguimos procurar pelo número e ‘nome do_campo’.

/* Macro sc_lookup */

$sql ="
SELECT
CodigoClienteID,
NomeCliente,
CPF
FROM
clientes
WHERE
CodigoClietneID={CodigoClienteID}
ORDER BY
CodigoClietneID
";

sc_lookup(cli, $sql);

/* Erro no lookup /
if (FALSE === {cli}) {
sc_error_message(“Ocorreu um erro no acesso ao banco de dados.
”);
}
elseif (empty({cli})) { /
EOF */

sc_error_message("Nenhum valor foi retornado pelo banco.<BR>");

}
else {

/* Inclua aqui sua rotina de processamento */

// NORMAL atual na SC 8.1:
$_CodigoClienteID = {cli[0][0]};
$_NomeCliente = {cli[0][1]};
$_CPF = {cli[0][2]};

// Sugestão além da forma normal poder procurar por nome do campo.
$_CodigoClienteID = {cli[0][‘CodigoClienteID’]};
$_NomeCliente = {cli[0][‘NomeCliente’]};
$_CPF = {cli[0][‘CPF’]};

}

Isso seria ótimo!

Eu não consigo nem imaginar o motivo de funcionar somente com números…

A estrutura interna do sc lookup não permite acessar as colunas pelo nome.
Internamente ele usa for loop incrementando um indexador numérico.

Mas eh possível vc criar seu próprio sc lookup que faça isso.

<?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;
  }  
}

?>

•••

Haroldo, você merece uma churrascada. Se for vegetariano faço pra você uma saladada.

Adoro churrasco, mas vai ter que esperar pois devo operar da vesícula nos próximos dias.

Mas vou cobrar hein.

Ah, essa função pode ser usada em bibliotecas externas.

O Fábio fez melhorias nela, vou pedir para ele posta aqui.

Grato Haroldo, pelo código, mas vamos deixar a sugestão em aberto para a própria NETMAKE implementar na macro, ai fica default e serve futuramente para todo mundo.

Conforme solicitação de Haroldo segue o código completo, com a melhoria de limite e intervalo de dados, levando em conta o reaproveitamento do código em diferentes bases de dados.

Coloquei no GitHub para quem quiser e melhorias serão bem vindas.
https://github.com/Softmus/sf_lookup

Obrigado

Por hora criei uma função que se acopla ao próprio sc_lookup, para quem quiser experimentar:

Função procurar no Indice do sc_lookup o nome do campo
// Testada no MySQL, nem todos os bancos aceitam LIMIT 1 no final,
// Ajustar conforme o Banco.

$sql="
SELECT
Codigo,
Nome AS NomePaciente,
Endereco,
CONCAT(Cidade,’-’,UF) AS CidadeUF
FROM
associados
WEHRE
Codigo={Codigo}
ORDER BY
Codigo
";

sc_lookup(rs, $sql); // sc_lookup nativo SC.

$_Nome= {rs}[0][$this->sc_look($sql, ‘NomePaciente’)];

function sc_look($sql, $campo) {
if (strpos($sql, ‘LIMIT’)>0) {
$sql=trim(substr($sql, 0, strpos($sql, ‘LIMIT’)));
}
sc_select(meus_dados, $sql.’ LIMIT 1’);
if (!$meus_dados->EOF) {
for ($i = 0; $i < $meus_dados->FieldCount(); $i++) {
$campos=$meus_dados->FetchField($i);
if (trim($campo)==trim($campos->name)) {
$meus_dados->Close();
return $i;
}
}
}
$meus_dados->Close();
return 0;
} // Fim da Função: function sc_look($sql, $campo)} // Fim da Função: function sc_look($sql, $campo)

Jailton, obrigado! Isso vai me ajudar.

Para selects simples, e com aliases e expressões?

Um concat no select já era.

Jailton já que teve o trabalho de criar a função para tentar resolver a questão, deve melhorar mais seu código para prever selects menos simples.

** Corrigido veja se passa agora no controle de qualidade ISO HAROLDO 14.001 hehehe

Risos.

Mudou totalmente o conceito, muito bem, agora sua função esta mais parecida com a que mostramos aqui inicialmente.

Só que usa um sc_select para capturar o nome? então para que o sc_lookup (redundou processamento)?

Ja analisou o que retorna dados o sc_select? Deveria. Mas foi criativo e bem malandro.

Ah! LIMIT 1 não funciona para todos os bancos e mesmo aplicando essa limitação o sc_select retorna um grande array e outra, vai executar mais de uma vez a instrução no banco, só para capturar cada nome de coluna?

Hum, seu primeiro código (o que apagou) ainda estava melhor do que esse.

Mas continue assim que você chega lá.

O código que disponibilizamos na verdade é o próprio sc_lookup. Quando o SC gera a app fonte php no lugar do sc_lookup que você escreve no editor de código do sc você encontrará exatamente esse código que disponibilizamos, apenas fizemos uma pequena alteração para aproveitar a classe PDO que o SC já utiliza para mudar o índice do result set de numérico para o nome da coluna.

Para quem foi escovador de bits como eu, trabalhando com linguagem de máquina em computadores de grande porte (só tamanho, rs) com 256k de memória, aprendemos a ser críticos em programação.A geração de hoje não tem mais esse tipo de cuidado.

Olá, não sei se entendi muito bem o tópico mas a macro sc_select já traz o nome dos campos e permite que sejam usados no lugar do índice.

$query = "SELECT equipamento, tipo_manutencao FROM controle_de_ordens_de_servico";				
	sc_select(rs, $query);

	while (!$rs->EOF){
		echo $rs->fields['equipamento'].'<br/>';
		echo $rs->fields['tipo_manutencao'].'<br/>';
		$rs->MoveNext();
	}

sc_lookup tem o foco de trazer registros únicos… (digamos)
Diferente do sc_select que traz um array de objetos. Apesar que eu ja usei o sc_select como um lookup da vida.

O sc_lookup monta um array com todo o resultado de uma única só vez,por isso aconselham a usa-lo com poucos ou 1 registro. O sc_lookup otimiza o resultado trazendo apenas os valores de suas colunas indexados numericamente.

O sc_select prepara para navegação entre os registros e traz uma linha por vez mas monta um array carregado de informações. Como diz o Fred ele gera um resource de um objeto.

Ai fica a sugestão para a própria Netmake alterar nas versões futuras o sc_lookup para funcionar com índice de número e nome campo.

sc_lookup(rs, $sql); // sc_lookup nativo SC.

$_Nome= {rs}[0][0]; // Atual
$_Nome= {rs}[0][‘NomePaciente’]; // Futuras versões também aceitarem assim.

Com isso sempre agregando mais valor na ferramenta.

Talvez, adicionar um parâmetro a mais na macro sc_lookup para escolher se quer trazer apenas índices ou associações.
Se não, as consultas podem vir a ficar lentas trazendo as duas informações sem muita necessidade.

E o que a função que disponibilizamos faz.

Pegamos os fontes do sc lookup e sc select e implementamos esse parâmetro.

Poderia aplicarse ao sc_lookup

http://www.scriptcase.com.br/docs/pt_br/v81/macros-scriptcase/macros-scriptcase#sc_set_fetchmode