Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Saudações Galera...
Estou com o seguinte erro:
SQLSTATE[HY000]: General error: 10007 The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified. [10007] (severity 5) [(null)]
Ao executar o seguinte codigo:
$sql = "SELECT p.Pac, pp.Dtp AS DtaAtend, prot.Descricao AS Protocolo,
ps1.DAB AS Espec, pf.Nome AS Profissional,
pta.Apresentacao AS Tipo_Atend
FROM Pacientes p
INNER JOIN Pacientes_Protocolos pp ON (p.Pac=pp.Pac)
INNER JOIN Protocolos prot ON (pp.Pro=prot.Pro AND pp.St=1)
INNER JOIN CorpoClinico cc ON (p.Mps=cc.Mps)
INNER JOIN Pessoa_Fisica pf ON (cc.Npf=pf.Npf)
INNER JOIN Produtos_Servicos ps1 ON (p.Esp=ps1.Cod)
LEFT JOIN Prd_Tipo_Atendimento pta ON (p.Id_Ret=pta.Chv)
WHERE p.Npf=? ";
if ($_REQUEST["protocolo"] != null) {
$sql .= "AND pp.Pro=? ";
} else {
$sql .= "AND pp.Pro<>? ";
}
$sql .= " UNION SELECT p.Pac, pp.Dtp AS DtaAtend, prot.Descricao AS Protocolo,
ps1.DAB AS Espec, pf.Nome AS Profissional,
pta.Apresentacao AS Tipo_Atend
FROM Historico_Pacientes p
INNER JOIN Pacientes_Protocolos pp ON (p.Pac=pp.Pac)
INNER JOIN Protocolos prot ON (pp.Pro=prot.Pro AND pp.St=1)
INNER JOIN CorpoClinico cc ON (p.Mps=cc.Mps)
INNER JOIN Pessoa_Fisica pf ON (cc.Npf=pf.Npf)
INNER JOIN Produtos_Servicos ps1 ON (p.Esp=ps1.Cod)
LEFT JOIN Prd_Tipo_Atendimento pta ON (p.Id_Ret=pta.Chv)
WHERE p.Npf=? ";
if ($_REQUEST["protocolo"] != null) {
$sql .= "AND pp.Pro=? ";
} else {
$sql .= "AND pp.Pro<>? ";
}
return $this->getPO()->loadDataWithSortExpression($sql, $startRow, $pageSize, null, array($idPaciente, $idProtocolo,$idPaciente, $idProtocolo));
Gostaria de saber se alguém já teve esse problema e conseguiu solucionar.
Att
Uerlen Santos
Ola Ricardo,
Então a consulta funciona bem mesmo fragmentada. O problema que ta ocorrendo é quando adiciono o ORDER BY, pois sem ORDER BY funciona, só que preciso dele. Aí que esta complicando e gerando o erro mencionado acima.
Obrigado por ter respondido!
faz post da funcao loadDataWithSortExpression para ver como esta sendo feito o sort.
>
faz post da funcao loadDataWithSortExpression para ver como esta sendo feito o sort.
Segue função:
public function loadDataWithSortExpression($sqlQuery, $startRow = null, $pageSize = null, $sortExpression = null, $params = null) {
if ($sqlQuery == null) {
throw new ArgumentNullException("sqlQuery");
}
if (!is_array($params)) {
$params = array($params);
}
$listReturn = array();
// Carrega a lista de atributos a serem preechidos nos objetos de retorno
$listAttr = $this->getPropertyAnnotations(null, null);
$sqlQuery = $this->customSqlInterpreter($sqlQuery);
$paramsBound = array();
// Verifica se existem parametros a serem adicionados no comando
if ($params != null) {
foreach($params as $p) {
if (!($p instanceof GDA_GDAParameter))
array_push($paramsBound, $p); //throw new InvalidDataTypeException('params are not GDAParameters');
else
array_push($paramsBound, $p->getValue());//$p->getParameterName()] = $p->getValue();
}
}
// Verifica se existe alguma expressão de ordenação relacionada
if ($sortExpression != null && trim($sortExpression) != "") {
if (!$sortExpression instanceof InfoSortExpression) {
$sortExpression = new InfoSortExpression($sortExpression);
//throw new InvalidDataTypeException("Argument sortExpression is not InfoSortExpression.");
}
$found = false;
// Procura a propriedade relacionada ao campo de ordenação
foreach ($this->mappedFields as $item) {
if ($item->representedProperty->getName() == $sortExpression->getSortColumn()) {
// Define a ordenação para o campo
$sqlQuery .= " order by " . ($sortExpression->getTableAlias()!=null ? $sortExpression->getTableAlias() . "." : "") . $item->name . ($sortExpression->isReverse() ? " desc" : "");
$found = true;
break;
}
}
if (!$found) {
throw new GDA_GDAException("Sort column {$sortExpression->getSortColumn()} not fount mapped.");
}
}
// Verifica se existem informações para paginação
if (isset($startRow) && !isset($pageSize)) {
throw new GDA_GDAException("Argument pageSize cannot be null.");
} else if (isset($pageSize) && !isset($startRow)) {
throw new GDA_GDAException("Argument startRow cannot be null.");
} else if (isset($startRow) && isset($pageSize) && !$startRow instanceof int && $pageSize instanceof int) {
throw new InvalidDataTypeException("Argument startRow and pageSize is not integer type.");
}
if (isset($startRow) && isset($pageSize)) {
if (stristr(strtolower($sqlQuery), 'order by') == false) {
// Recupera a chave identificade relacionda
$pKey = $this->getPropertyIdentityKey();
// Chave Identidade não localizada
if ($pKey == null) {
// Recupera algum propriedade chave
$pKey = $this->getFirtsPropertyKey();
if ($pKey == null) {
// Recupera a primeira propriedade do mapeamento
$pKey = $this->mappedFields[0];
}
}
if ($pKey != null) $sqlQuery .= ' order by ' . $pKey->name;
}
$sqlQuery = $this->adapter->limit($sqlQuery, $pageSize, $startRow);
}
$result = $this->adapter->fetchAll($sqlQuery, $paramsBound);
// Verifica e houve algum retorno do comando
if (sizeof($result) == 0)
return $listReturn;
$this->checkInputOptional($listAttr, $result[0]);
$keys = array_keys($result[0]);
foreach($result as $r) {
$obj = $this->getNewInstance();
$this->loadObjectData(&$obj, $listAttr, $keys, $r);
array_push($listReturn, $obj);
}
return $listReturn;
}>
SQLSTATE[HY000]: General error: 10007 The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified. [10007] (severity 5) [(null)]
Se eu entendi bem, o seu problema é mais com SQL do que com php.
Tente postar no fórum de SQL, lá existem mais especialistas nessa linguagem que podem te ajudar.
Tópico sendo respondido :devil:
O sql está muito extenso, fica dificil analisar. Já experimentou testar por partes? Do género, dividir o sql em pequenas querys e ir verificando onde está dando erro.