Recordset to hash

Post Reply
User avatar
leandro
Posts: 1744
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 34 times
Been thanked: 10 times
Contact:

Recordset to hash

Post by leandro »

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


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 24.09 ] [ xHarbour 64 bits) ]
User avatar
cnavarro
Posts: 6557
Joined: Wed Feb 15, 2012 8:25 pm
Location: España
Been thanked: 3 times

Re: Recordset to hash

Post by cnavarro »

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
leandro
Posts: 1744
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 34 times
Been thanked: 10 times
Contact:

Re: Recordset to hash

Post by leandro »

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


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


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


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

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 24.09 ] [ xHarbour 64 bits) ]
User avatar
cnavarro
Posts: 6557
Joined: Wed Feb 15, 2012 8:25 pm
Location: España
Been thanked: 3 times

Re: Recordset to hash

Post by cnavarro »

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
leandro
Posts: 1744
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 34 times
Been thanked: 10 times
Contact:

Re: Recordset to hash

Post by leandro »

Lo hago mediante ADO

Code: Select all | Expand

//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 24.09 ] [ xHarbour 64 bits) ]
User avatar
leandro
Posts: 1744
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 34 times
Been thanked: 10 times
Contact:

Re: Recordset to hash

Post by leandro »

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


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

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
Armando
Posts: 3271
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Been thanked: 2 times
Contact:

Re: Recordset to hash

Post by Armando »

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
Post Reply