Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: k_arlytos 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
-
Declara tu rs a un nivel superior para que no le de alzheimer.
Y no olvides rebobinarlo. (.movefirst)
-
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
-
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
-
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)
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
-
Cual es la estructura de la tabla donde tenes este menú? me parece que ahí empieza el problema
-
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)
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
-
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
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
-
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
-
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