Page 1 of 1
PROBLEMA CUANDO USO ORDE BY campo DESC CON XBROWSE
Posted: Wed Aug 02, 2017 2:44 am
by joseluisysturiz
Saludos, desde hace tiempo tengo este problema y lo resolvia no haciendo uso de la clausula DESC en ORDER BY de una consulta MySql, pero lamentablemente ahorita es obligatoria, uso un xBrowse con TDolphin que contiene una consulta con 3 tablas relacionadas con LEFT JOIN, hasta alli todo bien, pero cuando uso el xBrowse y hago click sobre las cabezeras que contienen _ por el cual hago el LEFT JOIN, entonces obtengo este mensaje de error "Error MYSQL/1052 Column 'id_provee' in order clause is ambiguous ", en las demas columnas hace el ordenamiento sin problemas, ahora si quito el DESC de la consulta, todo trabaja bien en todas las columnas, ni idea de como resolver este problema. Dejo el codigo usado, desde ya, gracias por las sugerencias y respuestas, saludos...gracias...
CONSULTA MYSQL / TDolphin
Code: Select all
cSql := "SELECT cm.id_provee, pv.provee_nombres, cm.com_num_fac, "
cSql += "cm.com_fch_fac, cm.com_peso_kilo, cm.com_unidades "
cSql += "FROM ge_pollos_compras_master AS cm "
cSql += "LEFT JOIN ge_pollos_compras_detalles AS cd ON cm.id_provee = cd.id_provee "
cSql += "AND cm.com_num_fac = cd.com_num_fac "
cSql += "LEFT JOIN ge_provee_master AS pv ON cm.id_provee = pv.id_provee "
cSql += "GROUP BY cm.id_compra_mas "
cSql += "ORDER BY cm.com_fch_fac DESC" // SI QUITO "DESC" TRABAJA TODO BIEN
XBrowse / TDolphin
Code: Select all
REDEFINE XBROWSE aBrw[2] ID 100 OF oFldx:aDialogs[2] ;
DATASOURCE oQryComPro ;
LINES CELL AUTOSORT AUTOCOLS ;
HEADERS "Cod.", "Nombre Proveedores", "Factura", "Fecha", "Kilos Compra" ,;
"Cant.Piezas";
COLUMNS "id_provee", "provee_nombres", "com_num_fac", "com_fch_fac" ,;
"com_peso_kilo", "com_unidades" ;
COLSIZES 50, 200, 50, 70, 80, 80 ;
JUSTIFY 2, , 2, 2 ;
PICTURES , , , , oPi:nKg1, oPi:nPi5
Re: PROBLEMA CUANDO USO ORDE BY campo DESC
Posted: Wed Aug 02, 2017 6:30 am
by Carlos Mora
Hola José Luis,
Creo que el problema radica en que le has puesto AUTOSORT al XBrowse, y este le añade una cláusula 'orderby' a la query para sacar los datos ordenados por proveedor. Prueba poniendo en las columnas 'cm.id_prove' en lugar de solo 'id:prove' a ver si con eso se resuelve la ambigüedad.
Un saludo
Re: PROBLEMA CUANDO USO ORDE BY campo DESC
Posted: Wed Aug 02, 2017 3:05 pm
by joseluisysturiz
Carlos Mora wrote:Hola José Luis,
Creo que el problema radica en que le has puesto AUTOSORT al XBrowse, y este le añade una cláusula 'orderby' a la query para sacar los datos ordenados por proveedor. Prueba poniendo en las columnas 'cm.id_prove' en lugar de solo 'id:prove' a ver si con eso se resuelve la ambigüedad.
Un saludo
Carlos, gracias por tu interes, de verdad no entiendo lo que sugieres que haga, lo del cm.id_provee lo uso en la consulta, el alias a la tabla es "cm" y el nombre del campo es "id_provee", no se de donde sacas que uso "id:prove", la ambiguedad se presenta so,lo cuando uso la clausula DESC en el ORDER BY de la consulta, creo la idea seria que en el auto sort del xbrowse, pudiera hacer lo mismo con la columna que quiero se ordenen mis registros, hace tiempo pregunte sobre como definir el AUTOSORT pero que inicie por la columna que quiero y si lo qiero ASC o DESC, creo eso resolveria mi problema, por los momentos he quitado "de nuevo" el DESC de la consulta para poder trabajar con mi xBrowse.
Haber si alguien mas da una idea o a los expertos en xBrowse, Mr.NAO, alguna idea de como resolver esto.? gracias...saludos...
Re: PROBLEMA CUANDO USO ORDE BY campo DESC CON XBROWSE
Posted: Wed Aug 02, 2017 6:33 pm
by Carlos Mora
Jose Luis,
perdona, es un dedazo.
Donde digo id:prove quise decir id_prove, en donde declaras las columnas del browse. El error se debe a que la query es un join, y hay columna id_prove en ambas tablas del join y no sabe a cual de las dos tablas te refieres. como has puesto AUTOSORT, debe estar tratando se hacer un ORDER BY id_prove y MySQL le suelta ese error.
O bien quita AUTOSORT del comando XBROWSE, o en las COLUMNS declara COLUMNS "cm.id_prove", "cm....." etc
Re: PROBLEMA CUANDO USO ORDE BY campo DESC CON XBROWSE
Posted: Wed Aug 02, 2017 11:00 pm
by joseluisysturiz
Carlos Mora wrote:Jose Luis,
perdona, es un dedazo.
Donde digo id:prove quise decir id_prove, en donde declaras las columnas del browse. El error se debe a que la query es un join, y hay columna id_prove en ambas tablas del join y no sabe a cual de las dos tablas te refieres. como has puesto AUTOSORT, debe estar tratando se hacer un ORDER BY id_prove y MySQL le suelta ese error.
O bien quita AUTOSORT del comando XBROWSE, o en las COLUMNS declara COLUMNS "cm.id_prove", "cm....." etc
Carlos, de la forma en que tengo definido el xBrowse, no puedo hacer si una cosa ni la otra, si quito el AUTOSORT, entonces no hay SORTEO al hacer click en las cabezeras de columnas que es lo practico y funcional del AUTOSORT y no puedo colocar el alias mas el nombre del campo ya que si te fijas, en mi SELECT digo cuales son _ y de que tablasson los que usare en mui xBrowse, usando exactamente el ALIAS, ejmp..."cm.id_provee", tampoco puedo colocar en el xBrowse el nombre de las columnas como lo sugieres ya que da error, asumiendo que la columna "cm.id_provee" no existe. Lo que debes tomar mas en cuenta es que SI QUITO EL "DESC" en la consulta, todo trabaja sin problemas, ese es mi gran punto..y problemas, xbrowse no respeta el DESC del Query...ya he probado casi todo y no se que mas inventar...saludos...gracias...
Re: PROBLEMA CUANDO USO ORDE BY campo DESC CON XBROWSE
Posted: Thu Aug 03, 2017 6:08 am
by Biel EA6DD
Recuerdo que tuve este problema, pero pensaba que habia subido _ al repositorio.
Lo que pasaba es que no se generaba bien el array aColumns, prueba de cambiar el metodo BuildDatas de la clase tDolphinQry
Code: Select all
METHOD BuildDatas( cQuery ) CLASS TDolphinQry
LOCAL aToken, cItem, cSelect, cTables, cFind,nPos
LOCAL aCommands := { "SELECT", ;
"WHERE",;
"GROUP",;
"HAVING",;
"LIMIT",;
"ORDER",;
"FROM",;
"DESC",;
"ASC" }
LOCAL nFind
DEFAULT cQuery TO ::cQuery
cQuery := AllTrim( cQuery )
aToken := HB_ATokens( cQuery, " " )
cSelect:=SubStr(cQuery,8,RAt('FROM',cQuery)-9) //Biel
::aColumns = ArrayFromSQLString( cSelect ) //Biel
FOR EACH cItem IN aToken
IF AScan( aCommands, {| cCommand | cCommand == Upper( cItem ) } ) > 0
cItem := "|" + cItem
ENDIF
NEXT
cQuery := ""
FOR EACH cItem IN aToken
cQuery += cItem + " "
NEXT
aToken := HB_ATokens( cQuery, "|" )
FOR EACH cItem IN aToken
cFind = Upper( SubStr( cItem, 1, At( " ", cItem ) - 1 ) )
// for comapibility with xharbour
// xharbour no accept string like switch constant
nFind = AScan( aCommands, cFind )
SWITCH nFind
/* CASE 1 //"SELECT" //Comentado por Biel, se procesa mas arriba
cSelect := AllTrim( SubStr( cItem, 8 ) )
DEBUG cSelect
::aColumns = ArrayFromSQLString( cSelect )
EXIT
*/
CASE 2 //"WHERE"
IF Empty( ::cWhere )
::cWhere := AllTrim( SubStr( cItem, 7 ) )
ENDIF
EXIT
CASE 3 //"GROUP"
IF Empty( ::cGroup )
::cGroup := AllTrim( SubStr( cItem, 10 ) )
ENDIF
EXIT
CASE 4 //"HAVING"
IF Empty( ::cHaving )
::cHaving := AllTrim( SubStr( cItem, 8 ) )
ENDIF
EXIT
CASE 5 //"LIMIT"
IF Empty( ::cLimit )
::cLimit := AllTrim( SubStr( cItem, 7 ) )
ENDIF
IF ! ::lPagination
IF Val(::cLimit) <= 1
::cLimit := ""
ENDIF
ENDIF
EXIT
CASE 6 //"ORDER"
IF Empty( ::cOrder )
::cOrder := AllTrim(SubStr( cItem, 10 ))
ENDIF
EXIT
CASE 7 //"FROM"
IF Empty( ::aTables )
cTables := AllTrim( SubStr( cItem, 6 ) )
::aTables := ArrayFromSQLString( cTables )
ENDIF
EXIT
CASE 8//"DESC" // Gabri
if ! ::lPagination
IF ! Empty( ::cOrder )
::cOrder += " DESC"
ENDIF
Endif
EXIT
CASE 9 //"ASC" // Gabri
if ! ::lPagination
IF ! Empty( ::cOrder )
::cOrder += " ASC"
ENDIF
Endif
EXIT
ENDSWITCH
NEXT
RETURN NIL
Re: PROBLEMA CUANDO USO ORDE BY campo DESC CON XBROWSE
Posted: Thu Aug 03, 2017 7:59 am
by Carlos Mora
Si la solución del master Byel no resuelve, podrías probar
Code: Select all
// cSql := "SELECT cm.id_provee, pv.provee_nombres, cm.com_num_fac, "
cSql := "SELECT cm.id_provee AS cm_id_provee, pv.provee_nombres, cm.com_num_fac, "
y en el xBrowse
Code: Select all
COLUMNS "cm_id_provee", "provee_nombres", "com_num_fac", "com_fch_fac" ,;
"com_peso_kilo", "com_unidades" ;
para ver si así se resuelve la ambigüedad.
No uso TDolphin, solo estaba tratando de interpretar el error de SQL y como se puede resolver.
Re: PROBLEMA CUANDO USO ORDE BY campo DESC CON XBROWSE
Posted: Thu Aug 03, 2017 1:46 pm
by joseluisysturiz
Carlos Mora wrote:Si la solución del master Byel no resuelve, podrías probar
Code: Select all
// cSql := "SELECT cm.id_provee, pv.provee_nombres, cm.com_num_fac, "
cSql := "SELECT cm.id_provee AS cm_id_provee, pv.provee_nombres, cm.com_num_fac, "
y en el xBrowse
Code: Select all
COLUMNS "cm_id_provee", "provee_nombres", "com_num_fac", "com_fch_fac" ,;
"com_peso_kilo", "com_unidades" ;
para ver si así se resuelve la ambigüedad.
No uso TDolphin, solo estaba tratando de interpretar el error de SQL y como se puede resolver.
Carlos, gracias por tu sugerencia, pero como ya comente antes, el problema no es MySql, ya que si uso la consulta en un administrador de base de datos como navicat, phpadmin, etc, todo trabaja sin problemas, el problema es TDOLPHIN, y como ya comente, al quitar el DESC, todo trabaja sin problemas, igual probe tu sugerencia para no descartarla y se repite el error, voy evaluar lo sugerido por Biel y luego comento, gracias por las sugerencias, saludos...
Re: PROBLEMA CUANDO USO ORDE BY campo DESC CON XBROWSE
Posted: Mon Aug 07, 2017 10:36 am
by Biel EA6DD
No es un problema de la sentencia, tDolphin recibe la sentencia SELECT, la interpreta y guarda en sus datas los atributos, relaciones, ordenaciones, where, etc
Con estos datas es capaz de crear nuevas sentencias SQL cuando sea necesario, por ejemplo al modificar el orden.
El problema es que cuando pasas DESC, tDolphin interpreta mal la sentencia, y no guarda los nombres de los atributos de la consulta en ::aColumns, al contruir nuevas sentencias SELECT se ha pertido toda la información de _ (pv.provee_nombres,...), y en su lugar crea la consulta con SELECT *, de ahí el error.
No le deis más vueltas a la sentencia, porque el problema no va en esa dirección.
Re: PROBLEMA CUANDO USO ORDE BY campo DESC CON XBROWSE
Posted: Mon Aug 07, 2017 2:33 pm
by joseluisysturiz
Biel EA6DD wrote:No es un problema de la sentencia, tDolphin recibe la sentencia SELECT, la interpreta y guarda en sus datas los atributos, relaciones, ordenaciones, where, etc
Con estos datas es capaz de crear nuevas sentencias SQL cuando sea necesario, por ejemplo al modificar el orden.
El problema es que cuando pasas DESC, tDolphin interpreta mal la sentencia, y no guarda los nombres de los atributos de la consulta en ::aColumns, al contruir nuevas sentencias SELECT se ha pertido toda la información de _ (pv.provee_nombres,...), y en su lugar crea la consulta con SELECT *, de ahí el error.
No le deis más vueltas a la sentencia, porque el problema no va en esa dirección.
Tranquilo Biel, se que la sentencia esta bien, solo le aclaraba al colega eso mismo, que el problema es TDolphin en la interpretacion de la sentencia, voy hacer _ que sugieres y luego comento si todo funciona bien, espero que si guiandome por tu experiencia sobre el tema, saludos, gracias...