Recordset to hash

Post Reply
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
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

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

//existe algo como FW_SAVETOHASH?

 
De Antemano gracias.
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Recordset to hash

Post by cnavarro »

C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
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

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

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

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

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 ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Recordset to hash

Post by cnavarro »

Qué estás utilizando para crear la conexion?
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Recordset to hash

Post by leandro »

Lo hago mediante ADO

Code: Select all

//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 ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
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

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 _ que quiero pasar
Image
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
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 _ 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