Page 1 of 1

xbrwose tdolphin y fillarray

Posted: Fri Dec 05, 2014 6:57 pm
by goosfancito
Hola.

Tengo un xbrowse que muestra:

Code: Select all

...
   aDatos:= consulta()
   oBrw:setArray(aDatos)

function consulta()
    local oQry
    define query oQry  "SELECT * FROM tbclientes"
return (oQry:fillarray())
No hay problemas cuando la consulta devuelve datos, pero si no devuelve datos el FillArray no "crea" el array que muestro en el xbrowse, por lo tanto el xbrowse
trona mal.

para verififcar hice esto:

Code: Select all

function consulta()
    local oQry, aDatos
    define query oQry "SELECT * FROM tbclientes"
    aDatos:= oQry:fillarray()
    xbrowse(aDatos)
return (aDatos)
 
y el xbrowse(aDatos) devuelve una sola columna si la consulta no devuelve datos, si devuelve datos el xbrowse(aDatos) me muestra todas las columnas...
Como hago para que cuando no tenga datos igual me muestre el xbrowse?

gracias.

Re: xbrwose tdolphin y fillarray

Posted: Sat Dec 06, 2014 2:59 am
by joseluisysturiz
Intenta definir el array con un registro en blanco, saludos... :shock:

ejemplo:
tu_array := {0,0,0, NIL, space(5),0}

Re: xbrwose tdolphin y fillarray

Posted: Sat Dec 06, 2014 11:10 am
by pablovidal
Para que poner los datos en un array,
si puedes poner directamente el query en el browse.

Date una revisadita a los ejemplos de la tDolphin

Code: Select all

  LOCAL oQry 
   LOCAL oDlg
   LOCAL oBrw
   LOCAL oData, oCol
   
   
   oQry = oServer:Query( "SELECT * FROM president ORDER BY last_name ASC" )
   
   DEFINE DIALOG oDlg SIZE 700,300 OF oWnd

   @ 0, 0 XBROWSE oBrw OF oDlg
   
   SetDolphin( oBrw, oQry )
      
   oBrw:CreateFromCode()
  
   oDlg:oClient = oBrw 
   
   ACTIVATE DIALOG oDlg CENTERED ON INIT oDlg:Resize()
   
   oQry:End()
 

Re: xbrwose tdolphin y fillarray

Posted: Sat Dec 06, 2014 1:22 pm
by acuellar
goosfancito como indica Pablo no es necesario cargar la tabla sin entre _ no va haber cálculos.

si la consulta es vacía la podes controlar así

Code: Select all

  LOCAL oQry 
   LOCAL oDlg
   LOCAL oBrw
   LOCAL oData, oCol
   
   
   oQry = oServer:Query( "SELECT * FROM president ORDER BY last_name ASC" )
   TotalRec:=oQry:nRecCount
  If TotalRec>0
     DEFINE DIALOG oDlg SIZE 700,300 OF oWnd

     @ 0, 0 XBROWSE oBrw OF oDlg
   
     SetDolphin( oBrw, oQry )
      
    oBrw:CreateFromCode()
  
     oDlg:oClient = oBrw 
   
    ACTIVATE DIALOG oDlg CENTERED ON INIT oDlg:Resize()
   
    oQry:End()
 Else
  MsgStop("No existen registros","Lo siento") 
 Endif
 

Re: xbrwose tdolphin y fillarray

Posted: Sat Dec 06, 2014 4:19 pm
by goosfancito
Hola.

Lo pongo en un array porque de otra forma tengo muchos inconvenientes a la hora de interactuar con el xbrowse,
no puedo hacer que el xbrowse muestre diferentes cabeceras en diferentes consultas, no esta funcionandome bien,
tengo que llamar dos veces al setdolphin para que me complete el xbrowse...
Estoy viendo que eso con el setarray no me pasa.

gracias.

Re: xbrwose tdolphin y fillarray

Posted: Sat Dec 06, 2014 4:21 pm
by goosfancito
joseluisysturiz wrote:Intenta definir el array con un registro en blanco, saludos... :shock:

ejemplo:
tu_array := {0,0,0, NIL, space(5),0}
lo q hice fue verificar si nreccount() dvuelve 0 registros, si lo hace hago lo que vos me decis (eso ya lo probe y anda)
pero despues de 10 put.. como se puedde arreglar para no tener que hacer esa comprobacion en cada fillarray?
como hacer para que el fillarray devuelva ese array vacio (por lo menos con la estructura)

gracias.

Re: xbrwose tdolphin y fillarray

Posted: Sat Dec 06, 2014 6:31 pm
by joseluisysturiz
Como ya dijeron los colegas, si no vas hacer nada de operaciones o edicion en el xbrowse, sino solo mostrar los datos, hacer un array es trabajar doble cuando con TDolphin y xBrowse puedes hacer maravillas y mas en los filtrados para mostrar datos con el oQry:setwhere(), creo que si pones algo mas de codigo de como estas haciendo tu query y utlizandolo en el xbrowse y lo que quieres en si hacer, entre todos podriamos ayudarte a resolver, te aseguro q con tdolphin + xbrowse, puedes hacer lo que quieres y mas, yo cargo array vacios o querys vacios sin ningun problema, todo esta en la buena combinacin entre TD + XB...saludos... :shock:

Re: xbrwose tdolphin y fillarray

Posted: Sun Dec 07, 2014 6:10 pm
by goosfancito
Les explico que necesito hacer

tengo un xbrowse, necesito que sea capaz de mostrar informacion de varias tablas dependienddo lo que el usuario necesite.
ya probe varias maneras, la unica que me muestra los datos como quiero es mostrando un array, de otra manera si lo hago sin eso
tengo que cada vez que hago un nuevo DEFINE QUERY volver a declarar el setdolphin(....), asi y todo mostrando el array tengo el mismo problema
cuando hago el setarray(...) las columnas del xbrowse pierden todo el nWidth, deja de expandir la ultima columna...
no entiendo que es lo que hago mal, la ultima modificacion (que pense que podía funcionar) me hace lo mismo.

aca dejo el codigo donde esta el problema.
gracias.

Code: Select all

METHOD pantalla()
   LOCAL oDlg
   LOCAL oGets := Array(3),;
         vGets := Array(3),;
         oBtns := Array(4),;
         oQry,;
         oBrw,;
         oFont,;
         oFont1,;
         adatos

   DEFINE FONT oFont NAME "" bold SIZE 0, -11
   DEFINE FONT oFont1 NAME "Ebrima" SIZE 0, -11

   vGets[1]:= Date()
   vGets[2]:= 4

   DEFINE DIALOG oDlg resource "CAJA"

      REDEFINE DTPICKER oGets[1] VAR vGets[1] ID 100 OF oDlg
      REDEFINE radio oGets[2] VAR vGets[2] ID 101, 102, 103, 104 OF oDlg

      //----------( botones )----------

      REDEFINE BUTTON oBtns[1] ID 200 OF oDlg
      REDEFINE BUTTON oBtns[2] ID 201 OF oDlg

      //----------( browser )----------

      oBrw:= TXBROWSE():new(oDlg)

      aDatos:= ::cargarBrowser(@oBrw, vGets)

      WITH OBJECT oBrw
         :setarray(aDatos)

         :bClrStd    := { || If( oBrw:KeyNo() % 2 == 0, ;
                   { CLR_BLACK, RGB( 255, 255, 255 ) }, ;
                   { CLR_BLACK, RGB( 214, 255, 215 ) } ) }

         :bClrSel:={ || { CLR_BLACK, CLR_WHITE} }

         :nMarqueeStyle       := 5
         :lKinetic            := .F.
         :ltransparent        := .F.
         :nRowHeight          := 18
         :lHScroll            := .T.
         :nheaderHeight       := 20
         :lRecordSelector     := .F.
         :lAllowColSwapping   := .F.
         :lColDividerComplete := .f.
         :nRowDividerStyle    := 4
         :nStretchCol         := STRETCHCOL_LAST
         :nColDividerStyle    := 4
         :L2007               := .T.

      END WITH

      oBrw:createfromresource(205)

      //----------( )----------

      oBtns[1]:bAction:= {|| ::cargarBrowser( oBrw, vGets )}
      oBtns[2]:bAction:= {|| ::cargarProductos( oBrw, vGets )}

   ACTIVATE DIALOG oDlg CENTERED

   RETURN (NIL)

//------------------------------------------------------------------------------

METHOD valorRetorno( nKey )

   RETURN ( NIL )

//------------------------------------------------------------------------------

METHOD cargarBrowser( oBrw, vGets)
   LOCAL oQry
   LOCAL cSql
   LOCAL aDatos

   DO CASE
      CASE vGets[2] = 1

      CASE vGets[2] = 2
      CASE vGets[2] = 3
      CASE vGets[2] = 4
         cSql:= "select " + ;
                "tbctacte.fecha as c1, " + ;
                "tbclientes.nombre as c2, " + ;
                "tbctacte.importe as c3 " + ;
                "from tbctacte " + ;
                "left join tbclientes " + ;
                "on tbclientes.id = tbctacte.idcliente " + ;
                "where tbctacte.fecha = " + ClipValue2SQL(vGets[1]) + ;
                " order by tbctacte.fecha"


      END CASE

      DEFINE query oQry cSql

      IF oQry:nRecCount()== 0
         aDatos:= {{"" ,"","",""}}
      ELSE
         aDatos:= oQry:fillarray()
      ENDIF

      oBrw:setarray(aDatos)

      DO CASE
         CASE vGets[2] = 4
            WITH OBJECT obrw
            WITH object :aCols[1]
            :cHeader       := "Fecha"
            :nWidth        := 100
            :nHeadStrAlign := AL_CENTER
         END with

         WITH object :aCols[2]
            :cHeader       := "Productos"
            :nHeadStrAlign := AL_CENTER
            :nWidth        := 250
         END with

         WITH object :aCols[3]
            :cHeader       := "Cantidad"
            :nWidth        := 120
            :nHeadStrAlign := AL_CENTER
         END with
         END with
      END CASE

      oBrw:refresh()

   RETURN (aDatos)