Page 1 of 2

Filtrar consulta de tdolphin

PostPosted: Sun Sep 24, 2023 6:01 pm
by JoseAlvarez
Saludos estimados amigos.

Necesito filtrar una consulta de tDolphin despues de realizada para mostrarla en un xBrowse.

He leido y visto ejemplos aqui en el foro sobre SetWhere pero no logro hacer que me funcione.

oQry:SetWhere("nSaldo>0")

Pero me da error de sintaxis.

nSaldo es una columna que se genera desde una subconsulta, es decir, no existe en la tabla, sino que se crea "al vuelo" por eso no puedo filtrar al momento de crear el objeto de la consulta.

Alguna luz de como solucionar?

Gracias!

Re: Filtrar consulta de tdolphin

PostPosted: Sun Sep 24, 2023 6:24 pm
by carlos vargas
Pasa la consulta a.una tbala dbf y haces el filtro. Es lo que se me ocurre.

Re: Filtrar consulta de tdolphin

PostPosted: Mon Sep 25, 2023 12:13 pm
by cmsoft
El setwhere tiene que ser sobre un campo de algunas de las tablas de tu consulta, no puede ser de un campo creado con AS
Otra opción es crear una tabla temporal mysql, con el resultado de tu consulta, y sobre ella hacer el setwhere

Code: Select all  Expand view

#include "tdolphin.ch"
#include "fivewin.ch"
FUNCTION Main()
LOCAL oServer, oBrw, oQry
CONNECT oServer HOST 'localhost' ;
                      USER 'user' ;
                      PASSWORD 'mypass' ;
                      PORT 3306 ;
                      FLAGS 0;
                      DATABASE 'test'

oServer:Execute("CREATE TEMPORARY TABLE IF NOT EXISTS temp "+;
                " (SELECT c.codpro as codigo, p.nombre as proveedor, sum(importe) as importe "+;
                " FROM compras c INNER JOIN proveedores p ON c.codpro = p.codigo GROUP BY c.codpro) ")
oQry := oServer:Query("SELECT * FROM temp")
oQry:SetWhere("importe > 10000")
xbrowse(oQry)
RETURN nil
 

Re: Filtrar consulta de tdolphin

PostPosted: Mon Sep 25, 2023 10:50 pm
by carlos vargas
Interesante, en que momento deja de existir esa tabla temporal?

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 4:09 am
by Armando
Carlos:

Las tablas TEMPORAY se auto-eliminan al momento de salir del PRG que las crea.

Saludos

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 9:06 am
by jnavas
José Saludos
Puedes utilizar la Clausula Having para filtrar el resultado de la consulta .

En el siguiente ejemplo, detectamos cuantos documentos estan repetidos CUANTOS>1
Code: Select all  Expand view

cSql:=[ SELECT DOC_CODSUC,DOC_TIPDOC,DOC_TIPTRA,DOC_NUMERO,DOC_FECHA,COUNT(*) AS CUANTOS]+;
        [ FROM DPDOCCLI ]+;
        [ WHERE DOC_TIPTRA="D" ]+;
        [ GROUP BY DOC_CODSUC,DOC_TIPDOC,DOC_TIPTRA,DOC_NUMERO,DOC_FECHA ]+;
        [ HAVING CUANTOS>1 ]+;
        [ ORDER BY DOC_CODSUC,DOC_TIPDOC,DOC_TIPTRA,DOC_NUMERO,DOC_FECHA ]
 

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 9:09 am
by jnavas
Jose,
Puedes agregar en tu consulta.
SELECT ... FROM ...
HAVING nSaldo >0

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 11:52 am
by cmsoft
carlos vargas wrote:Interesante, en que momento deja de existir esa tabla temporal?

Carlos, las tablas temporales solo tienen visibilidad en la sesion que son creadas, y mientras no se cierre la misma, tienen vida (o sea, mientras no hagamos oServer:End()).
Por lo demás, podemos hacer sobre ellas todo lo que podriamos hacer sobre una tabla normal. Creo que eso es una ventaja sobre una dbf.
Si tienes dos puestos de trabajo, y en ambos creas una tabla temporal, dichas tablas no serán visibles para el puesto que no las creó, por lo tanto puedes definir un módulo que las utilice, sin que se pisen los datos entre ambos puestos de trabajo.

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 12:26 pm
by JoseAlvarez
Hola a todos,


disculpen la tardanza en contestar a sus amables repuestas y ayuda.


Carlos Vargas: tu idea de la dbf es muy acertada, la tendré en cuenta para algún otro caso que se presente.

Cesar Gómez: a pesar de haber usado las tablas temporales de memoria en muchas oportunidades, no se me pasó por la mente hacerlo así ¡muy bien!

Juan Navas: tu idea usando HAVING funciona perfectamente, ¡excelente! tal como dices, solo tuve que agregar HAVING nSaldoFac>0
a la consulta y ¡LISTO!, a pesar de ser una columna dinámica.


Muchas gracias a todos por su generosa ayuda, todas las ideas que aportaron son útiles y las voy guardando, en algún momento cada una tendrá su aplicación en casos específicos.

Ahora bien, aprovecho de hacer otra consulta para terminar de colocarle "la cereza al helado"

Siempre que hago xBrowse usando como datasource un oQry, los totales en el footer hacen caso omiso de los PICTURE.
Si lo hago con un array, funciona perfecto el picture, pero con las consultas de mysql no. Dejo una imagen de referencia y el código.

Code: Select all  Expand view
        WITH OBJECT oBrwFac

              :aCols[5]:cEditPicture:= "@E 9,999,999,999.99"
              :aCols[5]:nFooterType := AGGR_TOTAL

              :aCols[6]:cEditPicture:= "@E 9,999,999,999.99"
              :aCols[6]:nFooterType := AGGR_TOTAL

              :aCols[7]:cEditPicture:= "@E 9,999,999,999.99"
              :aCols[7]:nFooterType := AGGR_TOTAL

              :MakeTotals()

        END
 


pero el resultado no respeta el picture:

Image

¿alguna idea de como solucionar?

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 4:56 pm
by nageswaragunupudi
Footer Pictures
Code: Select all  Expand view
#include "fivewin.ch"

function Main()

   local oServer, oQry

   FWNumFormat( "E", .t. )

   oServer := TDolphinSrv():New( "208.91.198.197", "gnraofwh", "Bharat@1950", ;
               0, 0, "fwhdemo" )

   oQry  := oServer:Query( "select id,first as Name, salary as Amount from customer" )

   XBROWSER oQry SETUP ( ;
      oBrw:Amount:nFooterType := AGGR_SUM, ;
      oBrw:MakeTotals(), ;
      oBrw:lFooter := .t. )

   oQry:End()
   oServer:End()

return nil
 


Image

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 5:42 pm
by nageswaragunupudi
Necesito filtrar una consulta de tDolphin despues de realizada para mostrarla en un xBrowse.


This is extremely easy using FWH Maria library.
But here we are using Dolphin.

Do not think of reading the filtered data again from the Server.
Let us just filter the data inside XBrowse. i.e., let us display in xbrowse only those records that match the filter condition.

We will take the above example.
We want to show only those records where the "AMOUNT" is exactly divisible by 19.
We will apply this filter on right mouse click.
Code: Select all  Expand view
#include "fivewin.ch"

function Main()

   local oServer, oQry

   FWNumFormat( "E", .t. )

   oServer := TDolphinSrv():New( "208.91.198.197", "gnraofwh", "Bharat@1950", ;
               0, 0, "fwhdemo" )

   oQry  := oServer:Query( "select id,first as Name, salary as Amount from customer" )

   XBROWSER oQry SHOW RECID SETUP ( ;
      oBrw:Amount:nFooterType := AGGR_SUM, ;
      oBrw:MakeTotals(), ;
      oBrw:lFooter := .t., ;
      oBrw:bRClicked := { |r,c,f,o| BrwRecs( o, { |Self| ( ::Amount:Value % 19 ) == 0 } ) } )

   oQry:End()
   oServer:End()

return nil

static function BrwRecs( oBrw, bFilter )

   local aRecs := {}

   Eval( oBrw:bGoTop )
   repeat
      if Eval( bFilter, oBrw )
         AAdd( aRecs, oBrw:BookMark )
      endif
   until Eval( oBrw:bSkip, 1 ) == 0
   oBrw:aFilter   := aRecs
   oBrw:GoTop()
   oBrw:MakeTotals()
   oBrw:Refresh()

return nil


Image

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 5:50 pm
by carlos vargas
Code: Select all  Expand view
     :aCols[ 07 ]:nFooterType   := AGGR_SUM
      :aCols[ 08 ]:nFooterType   := AGGR_SUM
      :aCols[ 09 ]:nFooterType   := AGGR_SUM
      :aCols[ 01 ]:cFooterPicture:= "9999"
      :aCols[ 07 ]:cFooterPicture:= "999,999,999.99"
      :aCols[ 08 ]:cFooterPicture:= "999,999,999.99"
      :aCols[ 09 ]:cFooterPicture:= "999,999,999.99"

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 6:11 pm
by nageswaragunupudi
carlos vargas wrote:
Code: Select all  Expand view
     :aCols[ 07 ]:nFooterType   := AGGR_SUM
      :aCols[ 08 ]:nFooterType   := AGGR_SUM
      :aCols[ 09 ]:nFooterType   := AGGR_SUM
      :aCols[ 01 ]:cFooterPicture:= "9999"
      :aCols[ 07 ]:cFooterPicture:= "999,999,999.99"
      :aCols[ 08 ]:cFooterPicture:= "999,999,999.99"
      :aCols[ 09 ]:cFooterPicture:= "999,999,999.99"


Our recommendation is NOT to write any code, which is not essential.
In other words, do not specify picture clauses at all in xbrowse.

Keep this one line of code at the beginning of the Application
Code: Select all  Expand view
FWNumFormat( "E", .t. ) // European format with thousand separators

and allow XBrowse to provide suitable cEditPictures and cFooterPictures.
You do not provide cEditPicture or cFooterPicture, except where it is a totally different kind.

With XBrowse, lesser the code better are the results.

Please see my above sample. We did not provide any picture clause.
But XBrowse, on its own, used the correct picture .

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 7:05 pm
by jnavas
José,
Colegas
Si deseas puedo apoyarles y/o capacitarles en el uso de MYSQL. Mi tel +5841430000518 jnadaptapro@gmail.com
Podemos ver:
1. Integridad referencial
2. Disparadores.
3. Vistas.
4. Sub consultas.
5. Optimización WHERE, JOIN

Re: Filtrar consulta de tdolphin

PostPosted: Tue Sep 26, 2023 7:07 pm
by jnavas
Corrijo mi tel +584143000518