Page 1 of 1
Error en TDOLPHIN, subselects
Posted: Wed Dec 15, 2010 9:06 pm
by Adolfo
Daniel...
Tengo consultas bien complejas en un modulo que carga todo en un xBrowse
ej.
Code: Select all | Expand
"select cli.RUT, cli.RAZON, dir.DIRECCION, dir.SECTOR, cli.FONO1, count(cta.SALDO) as CUOTAS, sum(cta.SALDO) as DEUDA, MAX(DATEDIFF(NOW(), cta.VENCE)) as DAP," + ;
" (select cob.FECHA from cobranzas as cob where cob.RUT=cli.RUT order by FECHA DESC limit 1 ) as FECHA," + ;
" (select cob.COMPROMISO from cobranzas as cob where cob.RUT=cli.RUT order by FECHA DESC limit 1 ) as COMPROMISO," + ;
" COALESCE((select cob.USUARIO from cobranzas as cob where cob.RUT=cli.RUT order by FECHA DESC limit 1 ),' ') as USUARIO" + ;
" from clientes as cli inner join clicta as cta on cta.RUT=cli.RUT, direcciones as dir " + ;
" where cta.ABONADO < cta.MONTO and cta.VENCE < '" + D2S(DATE()-1) + "' and dir.RUT=cli.RUT and dir.NUMERO=1 group by cli.RUT order by RUT"
Genero la consulta sin problemas, se carga el xBrowse ocn sus datos y realizo todas las operaciones sin problemas....pero al habilitar la opcion de Ordenar el xBrowse al hacer click en el header... se cae...
el problema... que el metodo BuildQuery() no construye el select de la misma forma que el original.
Me parece que Buildquery no entiende las SubSelects y las elimina del query modificado. Vi el codigo, pero preferi consultarte si es de rapida solucion, pues estoy trasladando un ERP de ADO a tDolphin aprovechando que quiero modificarlo.
Saludos
Desde Chile
Adolfo
Re: Error en TDOLPHIN, subselects
Posted: Wed Dec 15, 2010 10:23 pm
by Daniel Garcia-Gil
Adolfo
Si es una limitacion que encontrada con TDolphin, la ventaja que tenemos es que el codigo es totalmente abierto y entre todos podremos encontrar una forma alternartiva...
actualmente con ado como haces? puede que nos de una idea para solventar la limitacion
Gracias
Re: Error en TDOLPHIN, subselects
Posted: Thu Dec 16, 2010 1:48 am
by Adolfo
Daniel
Eso es resuelto por ADO directamente a traves de su metodo ::SORT
Daniel.. mi sorpresa es que se construyen bien todas las columnas, incluyendo los subselects, solo tengo que encontrar porque al llamar a BUILQUERY dentro de SETNEWFILTER, este se crea disminuido, o sea sin los subselects.
Es el primer gran escollo que encuentro, y al ser un sistema complejo,las proximas selects que debo trasladar son muchisimo mas extensas y complejas... se que funcionara el xbrowse... pero debere solucionar el tema del SETORDER. los usuarios estan muy acostumbrados ala mecanica de presionar los headers para ordenar por lo que se les plasca.
Mañana con la lucidez del nuevo dia, vere si me atrevo a intervenir el codigo de tdolphin para encontrarle una solucion...
Saludos
Desde Chile
Adolfo
Re: Error en TDOLPHIN, subselects
Posted: Thu Dec 16, 2010 11:31 am
by Daniel Garcia-Gil
Adolfo
Aun no lo he probado, pero se podria crear una nueva data
bOnNewFilter, de manera que puedas crear manualmente el filtro y recostruir las datas
esta seria una forma simple de usarlo
Code: Select all | Expand
PROCEDURE DataBrowse( oServer, oWnd )
LOCAL oQry
LOCAL oDlg
LOCAL oBrw
LOCAL oData, oCol
LOCAL cQry := "SELECT * FROM president ORDER BY "
oQry = oServer:Query( cQry + "last_name ASC" )
// Rebuild the query inside bOnNewFilter
oQry:bOnNewFilter = {| oSelf, nType | oSelf:cQuery := cQry + oSelf:cOrder, .F. }
DEFINE DIALOG oDlg SIZE 700,300 OF oWnd
@ 0, 0 XBROWSE oBrw OBJECT oQry AUTOSORT
oBrw:CreateFromCode()
oDlg:oClient = oBrw
ACTIVATE DIALOG oDlg CENTERED ON INIT oDlg:Resize()
oQry:End()
RETURN
te dejo
***AQUI**** el prg para que lo pruebes aun no lo he subido al SVN
este seria el cambio interno en la Clase TDolphinQry
crear la data
Code: Select all | Expand
DATA bOnNewFilter //codeblock to evaluate before set new query, should return .t./.f. to call BuildQuery
agregar esto a SetNewFilter
Code: Select all | Expand
if ::bOnNewFilter != NIL
// if you want change query, do it here,
// return .F. to skip BuildQuery and call BuildDatas()
// return .T. to call BuildQuery()
// isn't recommended return .T. with Sub-Select
l = Eval( ::bOnNewFilter, Self, nType )
// Convert automatically to logical value
l = ValType( l ) == "L" .and. l
endif
if l
::cQuery := ::BuildQuery( ::aColumns, ::aTables, ::cWhere, ::cGroup, ::cHaving, ::cOrder, ::cLimit )
else
::BuildDatas( ::cQuery )
endif
Re: Error en TDOLPHIN, subselects
Posted: Thu Dec 16, 2010 8:39 pm
by Adolfo
Daniel...
Parte del problema es que la funcion HB_TOKENS no discrimina bien las columnas..
He diseñado esta funcion ( a la rapida y sin optimizar) que soluciona ese problema y realmente llena el acolumns con el contenido de cada una ( incluyendo los subselects que siempre van entre parentesis)
Code: Select all | Expand
Function CheckTokens(cString)
Local aColumns:={}
Local nParenthesis:=0
Local nLast:=0
Local nCount:=0
For x=1 To Len(cString)
nCount++
If Substr(cString,x,1)="("
nParenthesis++
Endif
If SubStr(cString,x,1)=")"
nParenthesis--
Endif
If SubStr(cString,x,1)="," .And. nParenthesis=0
Aadd(aColumns,Alltrim(Substr(cString,nLast + 1, nCount-1 )))
nLast:=x
nParenthesis:=0
nCount:=0
Endif
Next
Return aColumns
Hasta ahi todo bien,pero al realizar otras operaciones, me toma el nombre de la columna como tal o sea cli.RUT en vez de solo RUT por ej.
Indicame por donde puede ir el resto....ya que al fin le veo algo de luz... jaja
Saludetes...
Desde Chile
Adolfo
Re: Error en TDOLPHIN, subselects
Posted: Fri Dec 17, 2010 9:32 pm
by Adolfo
Daniel....
Tengo solucionado en parte problema con las modificaciones que tu me diste.
Funciona bien, salvo que se demora lo mismo en construir el query que en ordenar, algo que no sucedia anteriormente.
Pero mientras encuentro otra solucion mas directa, sigo avanzando.
Gracias
Saludos
Desde Chile
Adolfo
Re: Error en TDOLPHIN, subselects
Posted: Fri Dec 17, 2010 9:38 pm
by Daniel Garcia-Gil
Adolfo
Adolfo wrote:Tengo solucionado en parte problema con las modificaciones que tu me diste.
Funciona bien, salvo que se demora lo mismo en construir el query que en ordenar, algo que no sucedia anteriormente.
Pero mientras encuentro otra solucion mas directa, sigo avanzando.
bien, pero recuerda que para cambiar el orden, la consulta se reconstruye, es decir, es un query nuevo que es enviado al servidor, es logico que demore lo mismo que la primera vez, el cliente no se encarga de esos procesos
Re: Error en TDOLPHIN, subselects
Posted: Fri Dec 17, 2010 9:38 pm
by Daniel Garcia-Gil
Adolfo
puedo subir el cambio al SVN, o me recomiendas que espere mas pruebas de tu parte?
Re: Error en TDOLPHIN, subselects
Posted: Fri Dec 17, 2010 10:02 pm
by Adolfo
Daniel....
Hasta con las SubSelects mas complejas ( de 2 niveles, o sea subselect con join a multiples tablas ) funciona sin problemas
El unico "pero" la velocidad de reconstruccion del orden.... pero de que funciona.. funciona.
Saludos
Desde Chile
Adolfo
Re: Error en TDOLPHIN, subselects
Posted: Fri Dec 17, 2010 10:14 pm
by Daniel Garcia-Gil
Adolfo wrote:Daniel....
Hasta con las SubSelects mas complejas ( de 2 niveles, o sea subselect con join a multiples tablas ) funciona sin problemas
El unico "pero" la velocidad de reconstruccion del orden.... pero de que funciona.. funciona.
Saludos
Desde Chile
Adolfo
es exactamente lo que te comentaba, hagas lo que hagas, la velocidad no la vas a mejorar, porque la sentencia es creada y enviada nuevamente desde cero
Ahora con un servidor mas potente en conjunto con un ancho de banda mas amplio (para el upload) o una paginacion podrias mejorar la velocidad, pero de resto dudo mucho que ese punto mejore