[RESOLVIDO] ERRO unexpected '$this' (T_VARIABLE)

Boa tarde Ilustres !

Estou com o seguinte problema na query:

sc_select (dataset,'Select cr.ENCARGOS, pr.VENDAINTERNAT, pr.VENDAINTERNAR from COMPLEMENTORAC cr, PRODUCAORAC pr Where cr.EMPRESAS_IDEMPRESAS in(select EMPRESAS_IDEMPRESAS from COMPLEMENTORAC ) and cr.ANO = '{ANO}' and cr.MES = TO_CHAR(pr.PERIODO, mm) and pr.PERIODO = '{MES}' and pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS;');

Se eu tiro as aspas simples (’’) do ANO e MES ele funciona porém daí estoura erro ORA-00911:invalid character no ORACLE 11g. Alguem consegue ver o que estou fazendo de errado? Meu dataset retorna vazio.

Este código está dentro de um Botão AJAX que eu criei na aplicação

  1. Primeiro sempre, use o SQL por fora da macro.
    $sql=“Select cr.ENCARGOS, pr.VENDAINTERNAT, pr.VENDAINTERNAR from
    COMPLEMENTORAC cr, PRODUCAORAC pr
    Where cr.EMPRESAS_IDEMPRESAS in(select EMPRESAS_IDEMPRESAS from COMPLEMENTORAC ) and
    cr.ANO = ‘{ANO}’ and
    cr.MES = TO_CHAR(pr.PERIODO, mm) and
    pr.PERIODO = ‘{MES}’ and
    pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS”;
    sc_select (dataset, $sql);

  2. Segundo você esqueceu uma virgula dentro do SQL no final cr.EMPRESAS_IDEMPRESAS;’);

Grande Jailton!

Você sempre atencioso com os problemas dos colegas! muito obrigado pela ajuda… mas agora pintou este erro na tela e não sei porque.
Estou usando o CAST para TO_CHAR… quando executo no SQL developer vai tranquilo.

code: Select cr.ENCARGOS, pr.VENDAINTERNAT, pr.VENDAINTERNAR from COMPLEMENTORAC cr, PRODUCAORAC pr Where cr.EMPRESAS_IDEMPRESAS in(select EMPRESAS_IDEMPRESAS from COMPLEMENTORAC ) and cr.ANO = ‘2007’ and cr.MES = TO_CHAR(pr.PERIODO, ‘mm’) and pr.PERIODO = ‘11’ and pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS 1840: ORA-01840: input value not long enough for date format
[/code]

Não sei o que está acontecendo.

utechii,

Tá meio estranho o teu SQL. O erro diz que o formato de data que estás usando no TO_CHAR está incompleto. Não seria melhor fazer assim:

Where cr.EMPRESAS_IDEMPRESAS in(select EMPRESAS_IDEMPRESAS from COMPLEMENTORAC ) and
cr.ANO = ‘{ANO}’ and
cr.MES = ‘{MES}’ and
pr.PERIODO = ‘{MES}’ and
pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS

ou

Where cr.EMPRESAS_IDEMPRESAS in(select EMPRESAS_IDEMPRESAS from COMPLEMENTORAC ) and
cr.ANO = ‘{ANO}’ and
cr.MES =TO_CHAR(pr.PERIODO, ‘mm’) and
pr.PERIODO = ‘{MES}’ and
pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS

?

Veja se o pr.PERIODO não é data, ele pode ser só = 2 CHAR, ai não precisar usar TO_CHAR

Pessoal vlw pela ajuda até aqui… Consegui executar o código sem erro só que meu dataset ta vindo com umas coisas estranhas, acredito que sejam parâmetros do sistema, mas meus dados não vieram, novamente testei no SGBD e funciona balinha… Dei um echo

 na dataset e peguei isso:

[code]ADORecordset_oci805 Object
(
[databaseType] => oci805
[bind] =>
[_fieldobjs] => Array
(
[0] => ADOFieldObject Object
(
[name] => ENCARGOS
[max_length] => 22
[type] => NUMBER
)

        [1] => ADOFieldObject Object
            (
                [name] => VENDAINTERNAT
                [max_length] => 22
                [type] => NUMBER
            )

        [2] => ADOFieldObject Object
            (
                [name] => VENDAINTERNAR
                [max_length] => 22
                [type] => NUMBER
            )

    )

[dataProvider] => native
[fields] => Array
    (
    )

[blobSize] => 100
[canSeek] => 
[sql] => Select  cr.ENCARGOS, pr.VENDAINTERNAT, pr.VENDAINTERNAR  from

COMPLEMENTORAC cr, PRODUCAORAC pr

Where cr.EMPRESAS_IDEMPRESAS in(select EMPRESAS_IDEMPRESAS from COMPLEMENTORAC ) and

cr.ANO = ‘2007’ and

cr.MES = TO_CHAR(pr.PERIODO, ‘mm’) and

pr.PERIODO = TO_DATE(‘11’, ‘mm’) and

pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS
[EOF] => 1
[emptyTimeStamp] =>
[emptyDate] =>
[debug] =>
[timeCreated] => 0
[fetchMode] => 15
[connection] => ADODB_oci805 Object
(
[databaseType] => oci805
[connectSID] => 1
[dataProvider] => oci8
[replaceQuote] => ‘’
[concat_operator] => ||
[sysDate] => TRUNC(SYSDATE)
[sysTimeStamp] => SYSDATE
[metaDatabasesSQL] => SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN (‘SYS’,‘SYSTEM’,‘DBSNMP’,‘OUTLN’) ORDER BY 1
[_stmt] => Resource id #50
[_commit] => 32
[_initdate] => 1
[metaTablesSQL] => select table_name,table_type from cat where table_type in (‘TABLE’,‘VIEW’) and table_name not like ‘BIN$%’
[metaColumnsSQL] => select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname=’%s’ order by colno
[_bindInputArray] => 1
[hasGenID] => 1
[_genIDSQL] => SELECT (%s.nextval) FROM DUAL
[_genSeqSQL] => CREATE SEQUENCE %s START WITH %s
[_dropSeqSQL] => DROP SEQUENCE %s
[hasAffectedRows] => 1
[random] => abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)
[noNullStrings] =>
[_bind] =>
[_nestedSQL] => 1
[_hasOCIFetchStatement] => 1
[_getarray] =>
[leftOuter] =>
[session_sharing_force_blob] =>
[firstrows] => 1
[selectOffsetAlg1] => 100
[NLS_DATE_FORMAT] => RRRR-MM-DD HH24:MI:SS
[dateformat] => YYYY-MM-DD
[useDBDateFormatForTextInput] =>
[datetime] =>
[_refLOBs] => Array
(
)

        [database] => 54.243.15.130/XE
        [host] => 
        [user] => ROOT
        [password] => 90634JJY
        [debug] => 1
        [maxblobsize] => 262144
        [substr] => substr
        [length] => length
        [upperCase] => upper
        [fmtDate] => 'Y-m-d'
        [fmtTimeStamp] => 'Y-m-d, h:i:s A'
        [true] => 1
        [false] => 0
        [nameQuote] => "
        [charSet] => WE8ISOICLUK
        [uniqueOrderBy] => 
        [emptyDate] =>  
        [emptyTimeStamp] =>  
        [lastInsID] => 
        [hasInsertID] => 
        [hasTop] => 
        [hasLimit] => 
        [readOnly] => 
        [hasMoveFirst] => 
        [hasTransactions] => 1
        [genID] => 0
        [raiseErrorFn] => 
        [isoDates] => 
        [cacheSecs] => 3600
        [memCache] => 
        [memCacheHost] => 
        [memCachePort] => 11211
        [memCacheCompress] => 
        [arrayClass] => ADORecordSet_array
        [numCacheHits] => 0
        [numCacheMisses] => 0
        [pageExecuteCountRows] => 1
        [uniqueSort] => 
        [rightOuter] => 
        [ansiOuter] => 
        [autoRollback] => 
        [poorAffectedRows] => 
        [fnExecute] => 
        [fnCacheExecute] => 
        [blobEncodeType] => 
        [rsPrefix] => ADORecordSet_
        [autoCommit] => 1
        [transOff] => 0
        [transCnt] => 0
        [fetchMode] => 
        [null2null] => null
        [_oldRaiseFn] => 
        [_transOK] => 
        [_connectionID] => Resource id #35
        [_errorMsg] => 
        [_errorCode] => 
        [_queryID] => Resource id #50
        [_isPersistentConnection] => 
        [_evalAll] => 
        [_affected] => 
        [_logsql] => 
        [_transmode] => 
        [bol_sc_debug] => 
        [bol_sc_debug_level] => 0
    )

[_numOfRows] => 0
[_numOfFields] => 3
[_queryID] => Resource id #50
[_currentRow] => 0
[_closed] => 
[_inited] => 1
[_obj] => 
[_names] => 
[_currentPage] => -1
[_atFirstPage] => 
[_atLastPage] => 
[_lastPageNo] => -1
[_maxRecordCount] => 0
[datetime] => 
[adodbFetchMode] => 0

)[/code]

meu código do botão ajax está assim:

[code]
/*QUERY PARA SELECIONAR OS VALORES PARA CALCULAR O PREÇO MÉDIO PRODUÇÂO RAC

$sql=“Select cr.ENCARGOS, pr.VENDAINTERNAT, pr.VENDAINTERNAR from
COMPLEMENTORAC cr, PRODUCAORAC pr
Where cr.EMPRESAS_IDEMPRESAS in(select EMPRESAS_IDEMPRESAS from COMPLEMENTORAC ) and
cr.ANO = ‘{ANO}’ and
cr.MES = TO_CHAR(pr.PERIODO, ‘mm’) and
pr.PERIODO = TO_DATE(’{MES}’, ‘mm’) and
pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS”;
sc_select (dataset, $sql);

/VERIFICA EXCESSÃO CASO NAO TENHA DADOS NO SELECT/

if(empty({dataset}))
{
sc_alert(‘ERRO na busca de dados!!!’);
}
else
{
echo ‘

’;
print_r({dataset});
echo ‘
’;
foreach({dataset} as $dt)
{
//Aqui o resultado será linha por linha e acessado por
{ENCARGOS}=$dt[0];//campo1 linha a linha
{VENDAINTERNAT}=$dt[2];//campo2 linha a linha
{VENDAINTERNAR}=$dt[3];//campo3 linha a linha
	 [preco_medio_global] = ((( VENDAINTERNAR / 1000 ) /VENDAINTERNAT ) / ENCARGOS );
	
	 
	 

	 
	/**
	 * Update a record on another table
	 */

	// SQL statement parameters
	$update_table  = 'PRODUCAORAC';      // Table name
	$update_where  = "ANO = {ANO} and PERIODO={MES}"; // Where clause
	$update_fields = array("PRECO_MEDIO = [preco_medio_global]");

	// Update record
	$update_sql = 'UPDATE ' . $update_table
		. ' SET '   . implode(', ', $update_fields)
		. ' WHERE ' . $update_where;
	sc_exec_sql($update_sql); 
	 
 }

}[/code]

Cria uma VIEW desta SQL e usa a VIEW para fazer o sc_select; usa conexão PDO com o ORACLE.

Certo, mas como eu iria passar os parametros ANO e MES por exemplo? Pq no SQL Developer não imagino como iria funcionar, se houver como explicar um pouco mais detalhado eu agradeço e muito meu amigo Jailton.

Também não entendo pq devo usar o PDO… Pelo que li na interweb serve para criar conexão com o banco de dados, mas isso já não está feito pelo próprio SC ?

Fico no aguardo.

Na hora que você cria a conexão com seu sistema no SC, veja se tem disponível na hora de fazer a ligação a opção com ORACLE PDO, se tiver use.

Crie a VIEW normal, sem filtrar, só use o Filtro de relação tipo INNER JOIN, depois que tiver com a VIEW criada, ai você pode usar as variáveis {ANO}, {MES}, etc no SC que dá certo,
pode até pegar a VIEW e usar ela em uma Consulta GRID para você ver como o SC vai mostrar e analisar os DADOS, depois pode usar o próprio filtro do SC nesta GRID para
ver ‘ele’ buscando os dados, depois é só fazer seu sc_select, ou sc_lookup de boa.

Bom dia Jailton, cara vc poderia me dizer em qual campo está essa informação do PDO pois não encontrei nada aqui na tela de “Editar Conexão” e “Nova conexão”. Na view quando vc diz pra fazer a View normal e sem filtrar, vc quis dizer que não devo utilizar cláusula WHERE no SELECT da view ?

  1. Se não tiver PDO no ORACLE, usa o que tem mesmo.

  2. O WHERE da VIEW pode ser assim:
    SELECT
    cr.ENCARGOS,
    pr.VENDAINTERNAT,
    pr.VENDAINTERNAR
    cr.ANO,
    cr.MES
    FROM
    COMPLEMENTORAC cr, PRODUCAORAC pr
    WHERE
    cr.EMPRESAS_IDEMPRESAS IN (SELECT EMPRESAS_IDEMPRESAS FROM COMPLEMENTORAC) AND
    cr.MES = TO_CHAR(pr.PERIODO, ‘MM’) AND pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS

  • Depois usa ela no SC que dá certo.

Então cara tenho esses campos aqui nas telas de Edição e Nova Conexão:

Nome da Conexão
Driver do SGDB
Testar Conexão
Nome do TSNAME

E o único que da pra selecionar é o “Driver do SGDB”. Essa query que vc colocou ai ta faltando o cr.ANO no WHERE.

SELECT
cr.EMPRESAS_IDEMPRESAS,
cr.ENCARGOS,
pr.VENDAINTERNAT,
pr.VENDAINTERNAR
cr.ANO,
cr.MES
FROM
COMPLEMENTORAC cr, PRODUCAORAC pr
WHERE
cr.EMPRESAS_IDEMPRESAS IN (SELECT EMPRESAS_IDEMPRESAS FROM COMPLEMENTORAC) AND
cr.ANO = TO_CHAR(pr.PERIODO, ‘YYYY’) AND
cr.MES = TO_CHAR(pr.PERIODO, ‘MM’) AND pr.EMPRESAS_IDEMPRESAS = cr.EMPRESAS_IDEMPRESAS

Pô legal, essa view funcionou perfeitamente no sql developer… Desculpe a inexperiência na ferramenta, mas como eu chamo ela no sc_select() ou sc_lookup e passo os parâmetros pra ela buscar os dados?

Depois que você criou a VIEW usa ela como se fosse uma tabela normal:

Vamos supor que o nome da VIEW ficou: view_vendas_periodo

SELECT
EMPRESAS_IDEMPRESAS,
ENCARGOS,
VENDAINTERNAT,
VENDAINTERNAR
ANO,
MES
FROM
view_vendas_periodo
WHERE
ANO=’{ANO}’ AND MES=’{MES}’

O ORACLE ‘Oráculo’ é SGDB muito robusto e cheio de recursos, você pode praticamente criar o sistema ‘regras de negócio’ todo nele, usando: funções, procedures, triggers, view e usar o SC para
refletir isso, tipo modelagem ‘MVC’.

Tem muito gente que é exclusivamente DBA certificada nele que monta o ‘sistema’ todo nele back-end e só reflete no front-end, esse pessoal ganha uma nota.

Bom dia gente!

Estou quase lá… a view ta balinha ja entendi como usála no SC e tudo mais!

mas o problema que meu Controle ele tem dois combos um de MEs outro ANO, a mudança é que na tabela de PRODUCAORAC eu retirei o ANO pq daí ficavam 4 comparações no WHERE agora só 3 pois substitui tudo por PERIODO daí eu atribuo o PERIODO ao cr.ANO e cr.MES… Só que minha data vem vazia não sei pq?

Código:

SELECT EMPRESAS_IDEMPRESAS, ENCARGOS, VENDAINTERNAT, VENDAINTERNAR, PERIODO, ANO, MES FROM ROOT.PRECO_MEDIO_DADOS WHERE PERIODO=''  

Esse é o select na VIEW como se fosse tabela joguei esse sql no lugar do outro que agora está na view dentro do SGDB… Notem que a parte do WHERE PERIODO =" , cade a data? :frowning:

Dei echo na data é não aparece nada… Acho que na hora que conseguir passar vai tudo funcionar direitinho

Para ficar mais fácil na base de separar cria a VIEW com: VIEW_ antes do nome da mesma.

Quais seus campos do controle?

{MES} = 99 CHAR?
{ANO} = 9999 CHAR?

Coloca na $sql="
SELECT
EMPRESAS_IDEMPRESAS,
ENCARGOS,
VENDAINTERNAT,
VENDAINTERNAR,
PERIODO,
ANO,
MES
FROM
VIEW_PRECO_MEDIO_DADOS
WHERE
ANO=’{ANO}’ AND MES=’{MES}’
";

Jailton os campos controles são:

COMPLEMENTORAC
ANO varchar2
MES varchar2

PRODUCAORAC
PERIODO date

Preciso do PERIODO primeiro pois ele é quem vai pegar a VENDAINTERNAT e VENDAINTERNAR certos. E na hora de colocar o Cálculo do campo PRECO_MEDIO da mesma tabela ele tbm será utilizado.

Ok então no CONTROLE veja a data,
se o formato interno esta como: AAAA-MM-DD

E no SELECT coloque assim:

Coloca na $sql="
SELECT
EMPRESAS_IDEMPRESAS,
ENCARGOS,
VENDAINTERNAT,
VENDAINTERNAR,
PERIODO,
ANO,
MES
FROM
VIEW_PRECO_MEDIO_DADOS
WHERE
PERIODO=’{PERIODO}’
";

Ai teste com o ‘echo’ no OnValidate antes de executar os comandos para ver se esta preenchendo a $sql= corretamente com a data.

Cara fiz o que vc me disse mas nada… a data entra vazia igual a seguir:

(oci805): SELECT EMPRESAS_IDEMPRESAS, ENCARGOS, VENDAINTERNAT, VENDAINTERNAR, PERIODO, ANO, MES FROM ROOT.PRECO_MEDIO_DADOS WHERE PERIODO=''

o Select ta assim agora:

$sql="SELECT EMPRESAS_IDEMPRESAS, ENCARGOS, VENDAINTERNAT, VENDAINTERNAR, PERIODO, ANO, MES FROM ROOT.PRECO_MEDIO_DADOS WHERE PERIODO='{PERIODO_CONTROLE}'";

Sendo que PERIODO_CONTROLE é o campo do tipo data que vem da tela. E o formato interno assim: AAAAMMDD

São exibidos na tela como MMAAAA em combos(select) MES E ANO.