Error en TDOLPHIN, subselects

Error en TDOLPHIN, subselects

Postby Adolfo » Wed Dec 15, 2010 9:06 pm

Daniel...

Tengo consultas bien complejas en un modulo que carga todo en un xBrowse

ej.

Code: Select all  Expand view
"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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1650
User avatar
Adolfo
 
Posts: 846
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile

Re: Error en TDOLPHIN, subselects

Postby Daniel Garcia-Gil » Wed Dec 15, 2010 10:23 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Error en TDOLPHIN, subselects

Postby Adolfo » Thu Dec 16, 2010 1:48 am

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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1650
User avatar
Adolfo
 
Posts: 846
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile

Re: Error en TDOLPHIN, subselects

Postby Daniel Garcia-Gil » Thu Dec 16, 2010 11:31 am

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 view

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 view
DATA bOnNewFilter   //codeblock to evaluate before set new query, should return .t./.f. to call BuildQuery


agregar esto a SetNewFilter

Code: Select all  Expand view
  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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Error en TDOLPHIN, subselects

Postby Adolfo » Thu Dec 16, 2010 8:39 pm

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 view
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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1650
User avatar
Adolfo
 
Posts: 846
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile

Re: Error en TDOLPHIN, subselects

Postby Adolfo » Fri Dec 17, 2010 9:32 pm

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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1650
User avatar
Adolfo
 
Posts: 846
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile

Re: Error en TDOLPHIN, subselects

Postby Daniel Garcia-Gil » Fri Dec 17, 2010 9:38 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Error en TDOLPHIN, subselects

Postby Daniel Garcia-Gil » Fri Dec 17, 2010 9:38 pm

Adolfo

puedo subir el cambio al SVN, o me recomiendas que espere mas pruebas de tu parte?
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Error en TDOLPHIN, subselects

Postby Adolfo » Fri Dec 17, 2010 10:02 pm

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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1650
User avatar
Adolfo
 
Posts: 846
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile

Re: Error en TDOLPHIN, subselects

Postby Daniel Garcia-Gil » Fri Dec 17, 2010 10:14 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 91 guests