Autor Tema: recordset recuerda sus valores en una funcion recursiva??  (Leído 4984 veces)

0 Usuarios y 1 Visitante están viendo este tema.

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
recordset recuerda sus valores en una funcion recursiva??
« en: Febrero 07, 2013, 01:47:20 am »
tengo un problema

el rs no recuerda los valores que tenia anteriormente
La idea es por lo que puedo tener un menu padre con submenus niño, y esas submenus niño puede tener cuentas de niño.

para eso estoy haciendo algo como una funcion recursiva pero el rs olvida lo que tenia anteriormente
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #1 en: Febrero 07, 2013, 02:06:02 am »
Declara tu rs a un nivel superior para que no le de alzheimer.

Y no olvides rebobinarlo. (.movefirst)
Me encuentras en YAcosta.com

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #2 en: Febrero 07, 2013, 02:16:13 am »
si esta declarado como publico la variable
lo que pasa esque ese mismo rs ejecuta consultas sql buscando mas hijos de los menus

y es por eso que se pierden los valores cuando hago una inspeccion al rs solo muestra el ultimo y se sale del bucle
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #3 en: Febrero 07, 2013, 03:01:34 pm »
Bueno, yo no comprendo, en todo caso publica el codigo para poder entender o quiza alguien si cazo tu problema y te responda la solución.

Saludos
Me encuentras en YAcosta.com

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #4 en: Febrero 08, 2013, 12:28:03 am »
Trato de buscar un submenu pasando como parametro el padre
cuando va a la primera la funcion busca si ese submenu tiene mas submenos por eso se llama
otra vez a la consulta pero a la primera vuelta ya debe de tener un registro cargado imaginemos que:

MenuPadre
  Menu1
      menu2
  Menu3
      menu4
  Menu5
      menu6

le paso el MenuPadre
ejecuta la consulta y devuelve MENU1,MENU3,MENU5

PERO PARA VER SI MENU1 TIENE MAS SUBMENOS SE LLAMA OTRA VEZ  A LA FUNCION PERO SUPUESTAMENTE
DEBE DE ESTAR CARGADO EN LA PRIMERA EJECUCION EL RESTO DE LOS MENUS(MENU3,MENU5)

le paso el Menu1
ejecuta la consulta y devuelve MENU2

y se sale del bucle se olvido de que tenia cargado los otros submenus(MENU3,MENU5)


Código: [Seleccionar]
Public Function Buscar_Sub_Menu(ByVal sMenu As String) As String

    Dim sql As String, menu As String
    Dim numRegistros As Integer
   
    sql = "Select ID,Sub_Menu,Descripcion from Menu where Sub_Menu='" + sMenu + "'  ORDER BY ID"

    Set oConexion = SqlHelper.Get_Conexion
    Set oProceso = New SqlHelper.ProcesosSH

    Set rsTemporal = oProceso.Execute_rsRead(oConexion, sql)
    numRegistros = rsTemporal.RecordCount

    Debug.Print numRegistros
   
    Do
   
        If numRegistros <= 0 Then Exit Do
       
        Debug.Print rsTemporal.Fields("ID"), rsTemporal.Fields("Sub_Menu")
        rsTemporal.MoveNext
       
        'If rsTemporal.EOF Then
            rsTemporal.MoveFirst
            Call Buscar_Sub_Menu(rsTemporal.Fields("ID"))
        'End If
   
   
    Loop While Not rsTemporal.EOF
    rsTemporal.MoveNext
'    SqlHelper.Desconectar oConexion
'    Set oProceso = Nothing
'    Set rsTemporal = Nothing
   
End Function
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #5 en: Febrero 08, 2013, 09:06:31 am »
Cual es la estructura de la tabla donde tenes este menú? me parece que ahí empieza el problema

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #6 en: Febrero 08, 2013, 12:55:25 pm »
Trato de buscar un submenu pasando como parametro el padre
cuando va a la primera la funcion busca si ese submenu tiene mas submenos por eso se llama
otra vez a la consulta pero a la primera vuelta ya debe de tener un registro cargado imaginemos que:

MenuPadre
  Menu1
      menu2
  Menu3
      menu4
  Menu5
      menu6

le paso el MenuPadre
ejecuta la consulta y devuelve MENU1,MENU3,MENU5

PERO PARA VER SI MENU1 TIENE MAS SUBMENOS SE LLAMA OTRA VEZ  A LA FUNCION PERO SUPUESTAMENTE
DEBE DE ESTAR CARGADO EN LA PRIMERA EJECUCION EL RESTO DE LOS MENUS(MENU3,MENU5)

le paso el Menu1
ejecuta la consulta y devuelve MENU2

y se sale del bucle se olvido de que tenia cargado los otros submenus(MENU3,MENU5)


Código: [Seleccionar]
Public Function Buscar_Sub_Menu(ByVal sMenu As String) As String

    Dim sql As String, menu As String
    Dim numRegistros As Integer
   
    sql = "Select ID,Sub_Menu,Descripcion from Menu where Sub_Menu='" + sMenu + "'  ORDER BY ID"

    Set oConexion = SqlHelper.Get_Conexion
    Set oProceso = New SqlHelper.ProcesosSH

    Set rsTemporal = oProceso.Execute_rsRead(oConexion, sql)
    numRegistros = rsTemporal.RecordCount

    Debug.Print numRegistros
   
    Do
   
        If numRegistros <= 0 Then Exit Do
       
        Debug.Print rsTemporal.Fields("ID"), rsTemporal.Fields("Sub_Menu")
        rsTemporal.MoveNext
       
        'If rsTemporal.EOF Then
            rsTemporal.MoveFirst
            Call Buscar_Sub_Menu(rsTemporal.Fields("ID"))
        'End If
   
   
    Loop While Not rsTemporal.EOF
    rsTemporal.MoveNext
'    SqlHelper.Desconectar oConexion
'    Set oProceso = Nothing
'    Set rsTemporal = Nothing
   
End Function

Doc, tu código esta extraño, me da la sensación de que este tema es sencillo, se trata de pasarle un nombre (menu) y que te devuelva sus submenus, recorrer esta consulta para pintarlo en tu barra de menus me imagino, no entiendo porque recorres de esa manera rsTemporal.
Ademas, a rsTemporal le haces Movenext y en la siguiente linea le haces MoveFirst para entrar a otra función. Por ultimo, no te podre ayudar mucho porque no conozco esto:
    Set oConexion = SqlHelper.Get_Conexion
    Set oProceso = New SqlHelper.ProcesosSH

Suerte que ahorita viene alguien mas para darte la precisa.

Saludos
Me encuentras en YAcosta.com

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #7 en: Febrero 11, 2013, 03:12:33 pm »
Bueno
    Set oConexion = SqlHelper.Get_Conexion   'es un clase que cree para que me devuelva una conexion Activa
    Set oProceso = New SqlHelper.ProcesosSH  'este otro es una clase donde hay funciones que devuelven recordset
 
a las finales un recordset no soporta recursividad a esta funcion le ayudo con un boomark

Código: [Seleccionar]

Public Function Listar_SubMenu(ByVal sMenu As String) As String

    Dim sql As String
    'sql = "Select ID,Sub_Menu,Descripcion from Menu where Sub_Menu='" + sMenu + "'  ORDER BY ID"
    sql = "Select ID,Sub_Menu,Descripcion from Menu"
   
    Set oConexion = SqlHelper.Get_Conexion
    Set oProceso = New SqlHelper.ProcesosSH
   
    Set rsTemporal = oProceso.Execute_rsRead_Table(oConexion, sql)
    rsTemporal.MoveFirst
   
    Call Buscar_Sub_Menu(rsTemporal, sMenu, 1)
    Listar_SubMenu = RPT
   
    SqlHelper.Desconectar oConexion
    Set oProceso = Nothing
    Set rsTemporal = Nothing
   
End Function

Private Function Buscar_Sub_Menu(ByRef rs As ADODB.Recordset, ByVal SubMenuID As String, ByVal level As Integer) As String
   
    Dim bm As String
    rs.Find "Sub_Menu = '" + SubMenuID + "'"
   
    Do While Not rs.EOF

        If rs!Sub_Menu <> SubMenuID Then Exit Function
       
        'Debug.Print String$(level, 9) & rs!ID & " " & rs!Sub_Menu
       
        bm = rs.Bookmark
       
        Dim EstadoMenu As String, Estado As String
       
        EstadoMenu = oProceso.Execute_rsEscalar(oConexion, _
        "Select ES.Descripcion from UsuarioxMenu MU Inner Join Estados ES ON(MU.EstadoID=ES.ID) Where MU.MenuID = '" + rs!ID + "'")
       
        If EstadoMenu = "0" Then
            Estado = "No"
        Else
            Estado = "Si"
        End If
       
        RPT = RPT + "/" + rs!ID + "-" + rs!Descripcion + "-" + Estado
       
        Buscar_Sub_Menu rs, rs!ID, level + 1

        rs.Bookmark = bm - 0 'esta es la parte graciosa jajaja porque si no le resto 0 sale error , xD
        rs.MoveNext

    Loop
    Buscar_Sub_Menu = RPT
   
End Function
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #8 en: Febrero 11, 2013, 03:18:20 pm »
LO QUE HICE TAMBIEN FUE REGISTRAR EN MI TABLA MENU

AL PRINCIPIO LO GUARDE ASI

ID / DESCRIPCION / SUBMENU
1 -   MENU1          00
2 -       MENU2       1
3 -       MENU3       1
4 -   MENU4           00
5 -       MENU5        4
6 -       MENU6        4
7 -           MENU7    6
8 -           MENU8    6

LUEGO LO HICE DE ESTA FORMA
 LAS CABECERAS LOS REGISTRE PRIMERO LUEGO LOS NIÑOS


1 - MENU1     00
2 - MENU4    00

3 - MENU2 1
4 - MENU3 1

5 - MENU5 4
6 - MENU6 4

7 - MENU7 6
8 - MENU8 6
     
     
« última modificación: Febrero 11, 2013, 03:25:00 pm por k_arlytos »
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:recordset recuerda sus valores en una funcion recursiva??
« Respuesta #9 en: Febrero 12, 2013, 01:47:51 pm »
Te arme un ejemplo con un treeview para que uses de referencia, en el rar esta el esquema de la tabla pero lo explico aca para que quede claro.

La tabla tiene, en este caso 3 columnas

ID - que es el id autonumerico
nombre -  el nombre del menu
parent - la refecencia al ID del nodo PADRE


Aca estan los datos que use para el ejemplo

"ID"   "nombre"   "parent"
"1"   "Main Menu1"   "0"
"2"   "Sub1"                 "1"
"3"   "Sub2"                 "1"
"4"   "MainMenu2"   "0"
"5"   "Sub1"                 "4"
"6"   "Sub Sub1"   "2"

Si por ejemplo miras el item 6 vas a ver que tiene como parent el item 2 que a su vez tiene como parent el item 1, por ende eso representa una estructura asi

Main Menu1>Sub1>Sub Sub1

La estructura es simple, no creo que tengas mayores problemas.

https://dl.dropbox.com/u/43394978/Nueva%20carpeta.rar