GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Postby joseluisysturiz » Fri Apr 27, 2012 5:41 am

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  Expand view
  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  Expand view

   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  Expand view
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 Registros Cargados 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]
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Postby RuFerSo » Sat Apr 28, 2012 2:11 pm

Joseluis esta excelente, muchas gracias.

Saludos

Ruben Fernandez
RuFerSo
 
Posts: 55
Joined: Mon Feb 20, 2012 2:56 pm

Re: GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Postby joseluisysturiz » Sat Apr 28, 2012 3:59 pm

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:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Postby leandro » Sat Apr 28, 2012 5:51 pm

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  Expand view

//---------------------------------
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  Expand view

 oBrw:bSeek            := { | c | Busca(c,oRs) }
  oBrw:oSeek               := oSay
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1669
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: GET LLAMA XBROWSE PARA SELECCIONAR-COMPARTIENDO CODIGO

Postby joseluisysturiz » Sat Apr 28, 2012 6:36 pm

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:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: russimicro and 60 guests