FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Recordset to hash
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Recordset to hash
Posted: Mon Jul 29, 2019 08: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 (fw): Select all Collapse
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

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Recordset to hash
Posted: Mon Jul 29, 2019 09: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
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Recordset to hash
Posted: 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 (fw): Select all Collapse
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 (fw): Select all Collapse
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 (fw): Select all Collapse
//----------------------------------------------------------------------------//

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

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Recordset to hash
Posted: 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
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Recordset to hash
Posted: Tue Jul 30, 2019 12:32 AM
Lo hago mediante ADO
Code (fw): Select all Collapse
//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

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Recordset to hash
Posted: Tue Jul 30, 2019 04: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. :-)

Code (fw): Select all Collapse
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[/list:u]
      2do la cantidad registros[/list:u]
        3er No se para que se utiliza. Alguien me puede indicar que hace? [/list:u]
          4to array con los campos que quiero pasar[/list:u]

Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Recordset to hash
Posted: 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

Continue the discussion