Sc_select dentro de Class não funciona

Testei em class interna e externa.

alguem pode me ajudar

Em bibliotecas externas não funciona, pois a biblioteca é inserida em tempo de execução na aplicação.
Em biblioteca interna as macros funcionam somente se forem uma única Function.

Em classes não vai funcionar mesmo.

As macros do SC, são códigos escritos de forma curta, que no momento da geração dos fontes são convertidas em códigos reais.

Existe um forma de vc pegar os códigos reais e usar diretamente dentro de uma classe oop em uma biblioteca externa.

Em uma app blank, aplica a macro sc_select com um sql funcional.
Em uma linha anterior ou posterior coloque um echo:
echo “me ache aqui”;

Em aplicação código fontes, exiba o código fonte da aplicação e com ctrl-f, localize “me ache aqui”.
Nesse ponto verás como a macro sc_select é convertida em código real. Copie o código real e o transcreva em um método da sua classe oop. Algumas adaptações terão que ser realizadas, mas estudando o código gerado saberá adaptar.

Obrigado, estava pensando nisso. eu consigo criar minha própria macro a parti do ADOdb ?

Sim. Funciona sim.

@#############################################################@

Olá.
Passei por essa dificuldade e resolvi da seguinte maneira.
Dentro de uma classe que criei em uma biblioteca externa, precisava utilizar ‘sc_select’, além de fazer updates em base de dados.

Na minha aplicação blank, que não é a biblioteca externa, fiz assim:


$cDB = $this->Db;
$cAtuaSoftDb = new AtualizaSoftDb( $aAtuSoft, $cDB );


Então na minha classe (AtualizaSoftDb) que está definida em uma biblioteca externa, fiz assim :


// definir classe e metodos para atualizacao do software

if (class_exists(‘AtualizaSoftDb’) == false ) {

class AtualizaSoftDb {

	protected $bInicializou = false;
	protected $bGravaLog = false;
	protected $sMensagemStatus = "";
	protected $sEnderecoDownloadAtualizacao = "";
	protected $sArquivoControleAtualizacao = "";	
	protected $aControleAtualizacoes = array();
	protected $aLog = array();
	protected $nVersaoAtualDb = 0.00;
	protected $nVersaoAtualSoft = 0.00;
	protected $bSucesso = true;
	protected $cDBSC;
		
	

	public function __construct( $aAtuSoft, &$cDB ) {		
		
		$this->cDBSC = $cDB;
		
		$this->bInicializou = true;
		$this->bSucesso = true;
		
		$this->aLog = array();
		
		if( $this->ObtemVersaoAtualSoftDb() == false ) {
			$this->bSucesso = false;				
		}
			
		
		if( trim( $aAtuSoft["cfg_endereco_download_atualizacao"] ) <> "" ) {
			$this->sEnderecoDownloadAtualizacao = trim( $aAtuSoft["cfg_endereco_download_atualizacao"] );				
			$this->AddLog( "Endereço para dowload de atualização: " . trim( $aAtuSoft["cfg_endereco_download_atualizacao"] ) );					
		} else {
			$this->bInicializou = false;
			$this->sMensagemStatus .= "EnderecoDownloadAtualizacao não fornecido.";
			$this->AddLog( "EnderecoDownloadAtualizacao não fornecido." );
			$this->bSucesso = false;
		}
		
		if( trim( $aAtuSoft["cfg_arquivo_controle_atualizacao"] ) <> "" ) {
			$this->sArquivoControleAtualizacao = trim( $aAtuSoft["cfg_arquivo_controle_atualizacao"] );
			$this->AddLog( "Arquivo de controle de atualização: " . trim( $aAtuSoft["cfg_arquivo_controle_atualizacao"] ) );					
		} else {
			$this->bInicializou = false;	
			$this->sMensagemStatus .= "ArquivoControleAtualizacao não fornecido.";
			$this->AddLog( "ArquivoControleAtualizacao não fornecido." );
			$this->bSucesso = false;
		}
		
		if( $this->BaixarArquivoControle() <> true ) {
			$this->bInicializou = false;
			$this->sMensagemStatus .= "Não foi possível baixar o arquivo de controle de atualizações.";	
			$this->AddLog( "Não foi possível baixar o arquivo de controle de atualizações." );
			$this->bSucesso = false;
		}
		
		
	}
	
	
	public function ObtemVersaoAtualSoftDb() {
		
		$bRetorno = false;
		
		$this->nVersaoAtualDb = 0.00;
		$this->nVersaoAtualSoft = 0.00;
		
		
		$sSql = "select vea_versao_db, vea_versao_software from \"satsas\".t_versao_atualiza order by vea_pk";
		// macros SC dentro de classe nao funcionam, por isso foi preciso receber o objeto DB para utiliza-lo dentro desta classe
		// sc_select( rs, $sSql )  // nao funciona dentro de classe		

		$sSql = "select vea_versao_db, vea_versao_software from \"satsas\".t_versao_atualiza order by vea_pk";
		
		$_SESSION['scriptcase']['sc_sql_ult_comando'] = $sSql; 
		$_SESSION['scriptcase']['sc_sql_ult_conexao'] = ''; 
		
		if ( $rs = $this->cDBSC->Execute($sSql)) { 
			
			while ( !$rs->EOF ){

				$this->nVersaoAtualDb = $rs->fields['vea_versao_db'];
				$this->nVersaoAtualSoft = $rs->fields['vea_versao_software'];

				$this->AddLog( "Versão atual de Software: " . $this->nVersaoAtualSoft );
				$this->AddLog( "Versão atual de Banco de Dados: " . $this->nVersaoAtualDb );

				$bRetorno = true;

				$rs->MoveNext();

			}
			
		} elseif (isset($GLOBALS["NM_ERRO_IBASE"]) && $GLOBALS["NM_ERRO_IBASE"] != 1) { 
			
			$rs = false;
			$rs_erro = $this->cDBSC->ErrorMsg();
			
			$this->AddLog( "Erro executando select no Banco de Dados: " . $rs_erro );
			
		}
		
		
		return $bRetorno;			
		
	}
}

}

// truncado aqui pois o código principal está acima


Dessa maneira contornei a situação.

Não funciona mesmo.
A classe (biblioteca externa) é inserida no ato da execução e o php não consegue interpretar a macro.
A macro é convertida em comandos php no ato da geração dos fontes.
Isso já foi discutido aqui.

A solução é usar o código gerado pela macro passando a conexão do banco como parâmetro.

Desenvolvi essa classe para usar sc_select, sc_lookup ou sc_exec_sql em bibliotecas externas:

<?php
class IWDBMaint
{
    private $dbConn;
    private $rows;
    private $fetchMode;
    private $dbRs = "";
    private $dbSqlRs = "";
    private $dbError = "";

    //fetchMode ADODB_FETCH_[NUM, ASSOC, DEFAULT, BOTH]
    //$this->Db conexão corrente
    //$this->Ini->nm_db_'nome da conexão' conexão alternativa
    function __construct($conn = NULL, $fetchMode = '')
    {
        $this->dbConn = $conn;
        if ($fetchMode) {
            $this->setFetchMode($fetchMode);
            $this->fetchMode = $fetchMode;
        }
    }

    public function setFetchMode($fetchMode = '')
    {
        $this->dbConn->fetchMode = $fetchMode ?: $this->fetchMode;
    }

    public function execute($sql, $type = 'lookup')
    {
        if ($rs = $this->dbConn->Execute($sql)) {
            $this->rows = $rs->FieldCount();
            if ($type == 'lookup') {
                $return = $rs->fields;
                $rs->Close();
            } else {
                $return = $rs;
            }
            $this->setFetchMode();
        } elseif (isset($GLOBALS["NM_ERRO_IBASE"]) && $GLOBALS["NM_ERRO_IBASE"] != 1) {
            $return = false;
            $this->dbError = $this->dbConn->ErrorMsg();
        }
        return $return;
    }

    public function getRows()
    {
        return $this->rows;
    }

    public function getError()
    {
        return $this->dbError;
    }
}

Exemplo de uso da classe:

$dbm= new IWDBMaint($this->Ini->nm_db_teste, ADODB_FETCH_ASSOC);
//$dbm->setFetchMode(ADODB_FETCH_ASSOC);

//**** no caso da macro sc_select ****
$rs = $dbm->execute('Select * from estados','select');
while (!$rs->EOF){
	echo '<pre>';	print_r($rs->fields);	echo '</pre>';
	$rs->MoveNext();
}
$rs->Close();

//**** no caso da macro sc_lookup ****
$ds = $dbm->execute('Select * from estados','lookup');
	echo '<pre>';	print_r($ds);	echo '</pre>';

No exemplo está usando a conexão de nome teste. para conexão padrão da aplicação usar: $this-Db