Recordset to hash

Recordset to hash

Postby leandro » Mon Jul 29, 2019 8:42 pm

Buenas tardes para todos,

Lo que pasa es que quiero pasar el resultado de una consulta (recorset), a un array de tipo hash, he buscado en el foro, pero no encuentro la respuesta. Alguien sabe como puedo hacer eso?

Code: Select all  Expand view  RUN

oVar:="SELECT * FROM clientes"
oRsFtr := FW_OPENRECORDSET(oCnFtr,oVar,adLockOptimistic,adOpenKeyset)

//existe algo como FW_SAVETOHASH?

 


De Antemano gracias.
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: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Recordset to hash

Postby cnavarro » Mon Jul 29, 2019 9:04 pm

Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6549
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Recordset to hash

Postby leandro » Mon Jul 29, 2019 10:05 pm

Como siempre muchas gracias Cristobal...

Bueno te cuento que cheque la publicación que mencionas, hay varias funciones alli, pero creo que la que mas se adapta a lo que necesito es la función RsToHash( oAdoRs, [nRows], [nStart], [aFields] ) --> Matriz hash
Code: Select all  Expand view  RUN

oVar:="SELECT * FROM clientes"
oRsFtr := FW_OPENRECORDSET(oCnFtr,oVar,adLockOptimistic,adOpenKeyset)
hDatos := RsToHash( oRsFtr, 1, 4)
xbrowse(hDatos)
 


el problema es que al correr la función me sale el siguiente error

Code: Select all  Expand view  RUN

Application
===========
   Path and name: C:\DLYMA\dlyma.exe (32 bits)
   Size: 5,968,896 bytes
   Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613)
   FiveWin  version: FWH 19.06
   C compiler version: Borland/Embarcadero C++ 7.3 (32-bit)
   Windows version: 6.2, Build 9200

   Time from start: 0 hours 0 mins 7 secs
   Error occurred at: 29/07/2019, 17:03:04
   Error description: Error ADODB.RecordSet/6  DISP_E_UNKNOWNNAME: GETROWS
   Args:
     [   1] = N   1
     [   2] = N   4

Stack Calls
===========
   Called from:  => TOLEAUTO:GETROWS( 0 )
   Called from: .\source\function\ADOFUNCS.PRG => RSGETROWS( 506 )
   Called from: .\source\function\ADOFUNCS.PRG => RSTOHASH( 486 )
   Called from: c:\dlyma\prg\R32_fact.prg => FPQRS( 58 )
   Called from: c:\dlyma\prg\R32_fact.prg => R32_FACT( 39 )
   Called from: c:\dlyma\prg\Alyma.prg => (b)TLYMA:AUTORIZA( 1139 )
   Called from: c:\dlyma\prg\Alyma.prg => TLYMA:AUTORIZA( 1139 )
   Called from: c:\dlyma\prg\R32_menu.prg => (b)MAIN( 440 )
   Called from: .\source\classes\TRBTN.PRG => TRBTN:CLICK( 717 )
   Called from: .\source\classes\TRBTN.PRG => TRBTN:LBUTTONUP( 917 )
   Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1791 )
   Called from: .\source\classes\TRBTN.PRG => TRBTN:HANDLEEVENT( 1575 )
   Called from: .\source\classes\WINDOW.PRG => _FWH( 3546 )
   Called from:  => WINRUN( 0 )
   Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE( 1078 )
   Called from: c:\dlyma\prg\R32_menu.prg => MAIN( 529 )
 


Esta es la función
Code: Select all  Expand view  RUN

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

function RsToHash(  oRs, nRows, nStart, aFields )
return   RsGetRows( oRs, nRows, nStart, aFields, "HASH" )

//----------------------------------------------------------------------------//
function RsGetRows( oRs, nRows, nStart, aFields, cFormat )

   // cFormat can be "HASH" or "JSON"

   local aRows

   DEFAULT nRows := -1, nStart := 0

   if !Empty( aFields ) .and. HB_ISARRAY( aFields )
      aRows    := oRs:GetRows( nRows, nStart, aFields )
   else
      aRows    := oRs:GetRows( nRows, nStart ) //LINEA DONDE DEVUELVE EL ERROR
   endif

   if HarbourNew()
      aRows    := ArrTransposeQ( aRows )
   endif

   if HB_ISCHAR( cFormat ) .and. !Empty( cFormat )
      cFormat  := Upper( Left( cFormat, 1 ) )
      if cFormat $ "JH"
         if Empty( aFields )
            aFields  := Array( oRs:Fields:Count() )
            AEval( aFields, { |c,i| aFields[ i ] := oRs:Fields( i - 1 ):Name } )
         endif
         if cFormat == "J"
            aRows := ArrToJson( aFields, aRows )
         else
            aRows := ArrToHash( aFields, aRows )
         endif
      endif
   endif

return aRows
 
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: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Recordset to hash

Postby cnavarro » Mon Jul 29, 2019 11:03 pm

Qué estás utilizando para crear la conexion?
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6549
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Recordset to hash

Postby leandro » Tue Jul 30, 2019 12:32 am

Lo hago mediante ADO
Code: Select all  Expand view  RUN
//CREAMOS LA CONEXION
vCnd := "DSN=dlyma;Uid="+oLamcla:cUsuario+";Pwd="+oLamcla:cPassword+";"
oCnFtr := FW_OpenAdoConnection( vCnd )
//Activamos  DB
vQry := "USE "+oLamcla:cEmpDBda
TRY
  oCnFtr:Execute(vQry)
CATCH oError
  FW_ShowAdoError(oCnFtr)
END
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: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Recordset to hash

Postby leandro » Tue Jul 30, 2019 4:48 pm

Investigando un poco logre convertir un arreglo a hash, el tema parece estar por el lado del tercer parámetro, que a este momento sigo sin entender, es el mismo parámetro que recibe la función oRs:GetRows( nRows, nStart ), pero sigo sin comprender para qué sirve. :shock:

Code: Select all  Expand view  RUN

oVar:="SELECT * FROM clientes"
oRsFtr := FW_OPENRECORDSET(oCnFtr,oVar,adLockOptimistic,adOpenKeyset)
hDatos := RsToHash( oRsFtr , , , {"ll_consec","nombre"} )
xbrowse(hDatos)
 

Lo que entiendo
    1er parámetro es el recorset
    2do la cantidad registros
    3er No se para que se utiliza. Alguien me puede indicar que hace?
    4to array con los campos que quiero pasar

Image
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: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Recordset to hash

Postby Armando » Tue Jul 30, 2019 11:59 pm

Leandro:

En oRs:GetRows(nCantidad de registros, a partir de que registro, campos a convertir)

En tu caso creo que quedaría así:

1er parámetro es el recorset
2do la cantidad registros (En blanco = Todos)
3er A partir de que número de registro (En blanco = A partir del primero)
4to array con los campos que quiero pasar

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3229
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 56 guests