Page 1 of 1

GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Posted: Fri Apr 27, 2012 5:41 am
by joseluisysturiz
Para los interesados, aca comparto un pequeño codigo que valida en un GET lo siguiente:
- si se entra ENTER y el campo es obligatorio llamara la tabla con un xbrowse para seleccionar un valor
- si se coloca un VALOR que no existe en la tabla te hara lo mismo, asi se obliga al usuario a seleccionar un dato si es necesario y no tiene que recordar tanto...
- si se coloca un VALOR que exista en la tabla entonce trae en este caso al campo siguiente el nombre del valor colocado en el get del codigo, este ejemplo lo hice con una tabla de proveedores, el cual solo me interesa obtener el codigo para grabarlo en otra tabla, el nombre es solo para mostrarlo sin guardarlo

Esta trabajado sobre tdolphin pero se puede adaptar a DBF, ADO o lo que quieran, cualquier duda estoy a la orden, no es nada del otro mundo, pero se que a alguien le servira asi como me sirvio a mi, saludos... :shock:

abro la tabla de proveedores

Code: Select all

   cQryProvee := "SELECT * FROM proveedores ORDER BY pro_codigo ASC"

   TRY
     oQryProvee := TDolphinQry():New( cQryProvee, oDatos:oConex )

   CATCH oError
      MSGALERT( oError:description() + CRLF + CRLF + ;
               "Error Ejecución de Sentencia en Tabla (proveedores): " + ;
               CRLF + CRLF + cQryProvee, oDatos:cTitMsg )
      RETURN

   END
 
validacion en el GET

Code: Select all

   REDEFINE GET aGet[2] VAR aVar[2] ID 102 OF oFldx:aDialogs[1] UPDATE PICT "@!" ; // COD.PROVEEDOR
      ACTION ( oQBtn := llamabrow( aVar[2], "proveedores", "pro_codigo" ,;
                                   {"pro_codigo", "pro_nombre"} ,;
                                   {"Código", "Nombre"} ) ,;
               IIF( !oQBtn[1] ,;
                  ( alert("DEBE SELECCIONAR PROVEEDOR...") ,;
                    aVar[3] := NIL, aGet[3]:REFRESH(), .f. ) ,;
                  ( aVar[2] := oQBtn[2]:pro_codigo, aGet[2]:REFRESH() ,;
                    aVar[3] := oQBtn[2]:pro_nombre, aGet[3]:REFRESH() ,;
                    aGet[4]:SetFocus(), .t. ) ) ) ;
      VALID ( IIF( oQryProvee:Seek(aVar[2], "pro_codigo") == 0 ,;
                 ( oQBtn := llamabrow( aVar[2], "proveedores", "pro_codigo" ,;
                                       {"pro_codigo", "pro_nombre"} ,;
                                       {"Código", "Nombre"} ) ,;
                 ( IIF( !oQBtn[1] ,;
                 ( alert("DEBE SELECCIONAR PROVEEDOR...") ,;
                   aVar[3] := NIL, aGet[3]:REFRESH(), .f. ) ,;
                 ( aVar[2] := oQBtn[2]:pro_codigo, aGet[2]:REFRESH() ,;
                   aVar[3] := oQBtn[2]:pro_nombre, aGet[3]:REFRESH(), .t. ) ) ) ) ,;
                 ( alert("ENTRO VALOR QUE EXISTE") ,;
                   aVar[2] := oQryProvee:pro_codigo, aGet[2]:REFRESH() ,;
                   aVar[3] := oQryProvee:pro_nombre, aGet[3]:REFRESH(), .t. ) ) )
 
funcion que muestra el xbrowse para seleccionar

Code: Select all

FUNCTION llamabrow( aVar, cTabla, cCampo, aCampos, aTitulos ) // FUNCION PARA LLAMAR BROWSE EN BOTON DE GET...
// DEVUELVE ARRA
// aVar -> contenedora del valor entrado (puede llegar vacio solo para seleccionar)
// cTabla -> nombre de la tabla para hacer el query
// cCampo -> nombre del campo para ordenar el query y hacer comparacion con aVar ((puede llegar vacio solo para seleccionar))
// aCampos -> contenedor de las var para el browse
// aTitulos -> contenedor de los titulos de las columnas

   LOCAL oWnd, oDlg, oBrow, cSqlCmd, oQry, oError, ;
         aBtn[2] ,;
         lSelec := .f.

   cSqlCmd := "SELECT * FROM " + cTabla + " ORDER BY " + cCampo + " ASC"

   TRY
     oQry := TDolphinQry():New( cSqlCmd, oDatos:oConex )

   CATCH oError
      MSGALERT( oError:description + CRLF + CRLF +;
                "Error en Consulta, Sentencia: " + CRLF + CRLF + cSqlCmd, oDatos:cTitMsg )
      RETURN( {.f., NIL} )

   END

   IF oQry:LastRec() = 0
      MSGINFO( "No hay _ en Tabla..." + cTabla, oDatos:cTitMsg )
      RETURN( {.f., NIL} )

   ENDIF


   DEFINE DIALOG oDlg RESOURCE "DLG_BRW" of oWnd ;
      TITLE " Seleccione " + aTitulos[1]

   oBrow := TXBrowse():New( oDlg )

   WITH OBJECT oBrow
      :SetDolphin( oQry, .t., .t., aCampos )
      :nMarqueeStyle    := MARQSTYLE_HIGHLROW
      :nColDividerStyle := LINESTYLE_BLACK
      :nStretchCol      := STRETCHCOL_LAST
      :lColDividerComplete := .t.
      :nHeaderHeight := 30
      :l2007 := .t.
      :lFooter := .t.
      :lRecordSelector := .t.
      :bClrStd := {|| IF(  oQry:RecNo() % 2 == 0, {CLR_BLACK, CLR_WHITE}, {0, RGB(203,226,254)} ) }

      :bKeyDown := {|nKey| IIF( nkey == 13 ,; // Si Pulsa ENTER
                              ( lSelec := .t., oDlg:End() ), ) }

      :bLDblClick := {|| ( lSelec := .t., oDlg:End() ) }

   END WITH

   oBrow:aCols[1]:cHeader       := aTitulos[1]
   oBrow:aCols[1]:bStrData      := {|| IIF( oQry:LastRec() > 0, cValToChar( oQry:FieldGet( aCampos[1] ) ), ) }
   oBrow:aCols[1]:nHeadStrAlign := AL_LEFT
   oBrow:aCols[1]:nDataStrAlign := AL_LEFT

   oBrow:aCols[2]:cHeader       := aTitulos[2]
   oBrow:aCols[2]:bStrData      := {|| IIF( oQry:LastRec() > 0, cValToChar( oQry:FieldGet( aCampos[2] ) ), ) }
   oBrow:aCols[2]:nHeadStrAlign := AL_LEFT
   oBrow:aCols[2]:nDataStrAlign := AL_LEFT

   oBrow:CreateFromResource(100)

// BOTON SELECCIONAR
   REDEFINE BUTTONBMP aBtn[1] ID 201 OF oDlg UPDATE ;
      ACTION ( lSelec := .t., oDlg:End() ) ;
      BITMAP 2006 PROMPT "Seleccionar"

// BOTON CALCELAR
   REDEFINE BUTTONBMP aBtn[2] ID 202 OF oDlg UPDATE ;
      ACTION ( lSelec := .f., oDlg:End() ) ;
      BITMAP 2004 PROMPT "Cancelar"

   aBtn[2]:lCancel := .t.

   ACTIVATE DIALOG oDlg CENTER

   oQry:End()

RETURN( {lSelec, oQry} ) // FIN FUNCION PARA LLAMAR BROWSE EN BOTON DE GET...
 
luego le agregare en el xbrowse una busqueda secuencial, si alguien lo mejora, super...

espero alguien pueda sacarle provecho...

Image

Uploaded with ImageShack.us[/img]

Image

Uploaded with ImageShack.us[/img]

Image

Uploaded with ImageShack.us[/img]

Re: GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Posted: Sat Apr 28, 2012 2:11 pm
by RuFerSo
Joseluis esta excelente, muchas gracias.

Saludos

Ruben Fernandez

Re: GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Posted: Sat Apr 28, 2012 3:59 pm
by joseluisysturiz
RuFerSo wrote:Joseluis esta excelente, muchas gracias.

Saludos

Ruben Fernandez
Comparado con lo que he recibido de este gran foro, es algo muy sencillo, alegro alguien no solo lo haya visto, sino que lo haya utilizado, estoy preparando la parte para hacer busqueda cuando muestro el xbrowse, saludos... :shock:

Re: GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Posted: Sat Apr 28, 2012 5:51 pm
by leandro
Jose el xbrowse ya viene con una funcion para la busqueda incremental, del Foro saque esta función que Hace la búsqueda sobre el recorset... Espero sirva para mejorar tu aporte.

Code: Select all

//---------------------------------
STATIC FUNCTION Busca(cBuscar,oRs)
   LOCAL nLen:=Len(cBuscar)
   STATIC nLenAnt
   DEFAULT nLenAnt:=0
   IF Len(cBuscar)>1
      IF(nLenAnt>nLen,oRs:MoveFirst(),)
      //oRs:Find( "t_codigo LIKE '"+cBuscar+"*'",,1)
      oRs:Find( vOrden+" LIKE '"+cBuscar+"*'",,1)
   ELSE
      oRs:MoveFirst()
      IF !Empty(cBuscar)
         //oRs:Find( "t_codigo LIKE '"+cBuscar+"*'",,1)
         oRs:Find( vOrden+" LIKE '"+cBuscar+"*'",,1)
      ENDIF
   ENDIF
   nLenAnt:=nLen
RETURN !(oRs:Eof.OR.oRs:Bof)
 
hay que colocar esto al momento de llamar al xbrowse

Code: Select all

 oBrw:bSeek            := { | c | Busca(c,oRs) }
  oBrw:oSeek               := oSay

Re: GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Posted: Sat Apr 28, 2012 6:36 pm
by joseluisysturiz
Leandro, habia olvidao esa parte del xBrowse, tienes razon, no hace falta hacerle nada para la busqueda incremental, funciona perfectamente tal como esta, solo hay que dar alguna informacion al usuario para que sepa que debe seleccionar la columna por el cual quiera hacer la busqueda, bueno, si alguien quiere agregarle o sugerir alguna mejora, sera bienvenida, al final es para eso el aporte, para aprovecharlo todos, ya queda que los que la usen la adapten a sus beneficios, saludos... :shock: