Cómo buscar y guardar valores en blanco en una aplicación creada con el programa Visual Basic

Nuevamente acudo a usted con el siguiente problema, desde un formulario guardo o actualizo información en varias tablas vinculadas, primero se carga el Id del empleado, la cedula y los nombres, luego con la información del id se deben cargar también el cargo, el fondo, el área y el nivel, es decir, la instrucción debe buscar el ID que corresponda con las demás, el problema esta en que cuando cargo un empleado que no posee información del cargo, fondo, área y nivel me manda el siguiente error: El Valor de BOF o EOF es True, o el actual registro se elimino; la operación solicitada requiere un registro actual. He intentado validar los cuadros de texto con la sentencia IsNull pero cuando cargo al empleado me envía el valor que tenga en blanco así el empleado ya tenga información, no se que más hacer le envío el código que utilizo a ver en que me puede colaborar:
Private Sub GrillaCargar_DblClick()
Asignaciones.Show
With rsEmpleados
     If .BOF Or .EOF Then Exit Sub
     .Find "IdEmpleados='" & Val(GrillaCargar.Columns(0).Text) & "'"
      Asignaciones.txtcodigo = !IdEmpleados
      Asignaciones.txtinsertarc = !Cedula
      Asignaciones.lblnombresa.Caption = !Nombres & "   " & !Apellidos
End With
With RsAsignacion
     If .BOF Or .EOF Then Exit Sub
     .Find "IdAsignacion='" & Val(Asignaciones.lblcodigoasi.Caption) & "'"
           !IdEmpleado = Asignaciones.txtcodigo.Text
           !Cargo_Inicial = Asignaciones.txtcinicial.Text
           !Cargo_Actual = Asignaciones.txtcactual.Text
           !Fecha_Cargo = Asignaciones.txtfechac.Text
           !Fondo_Inicial = Asignaciones.txtinicialf.Text
           !Fondo_Actual = Asignaciones.txtactualf.Text
           !Fecha_Fondo = Asignaciones.txtfechaf.Text
           !IdArea = Asignaciones.lblcodi.Caption
           !IdNivel = Asignaciones.lblcodig.Caption
End With
With RsAreas
     If .BOF Or .EOF Then Exit Sub
     .Find "IdArea='" & Val(Asignaciones.lblcodi.Caption) & "'"
         !Codigo = Asignaciones.txtcodigoa.Text
         !Area = Asignaciones.txtarea.Text
End With
With RsNivel
     If .BOF Or .EOF Then Exit Sub
     .Find "IdNivel='" & Val(Asignaciones.lblcodig.Caption) & "'"
         !Codigo = Asignaciones.txtcodigon.Text
         !Nivel = Asignaciones.txtnivel.Text
End With
Unload Me
End Sub
Estaré atento a su respuesta y de

1 Respuesta

Respuesta
1
Yo creo que lo mejor es hacer un INNER JOIN para juntar las tablas y que te traiga la información que necesitas.
¿Sabes hacer eso?
Buenos días, realmente no se como organizar el código, por favor oriénteme como hacerlo, si lo prefiere, le envío el proyecto nuevamente para que aprecie mejor lo que le quiero decir. Cualquier cosa me informa y el correo donde se lo puedo enviar
Cuantas tablas son por que yo aun mantengo el proyecto que me enviaste y la base de datos, así es que dime cuales son las tablas que necesitas juntar y también cuantas son.
Buenas tardes, son cinco tablas las que afectan la tabla principal, la tabla principal se llama asignaciones, en ella se toman los valores de las tablas empleados, cargos, fondos, área y nivel, este formulario no lo debes tener pues es nuevo, sin embargo te envío el proyectos para que aprecie mejor la pregunta que le estoy haciendo.
Gracias...
Por lo que veo en la base de datos, solo tienes relacionadas tres tablas, Cargos, Nivel y Área, quedan fuera Fondos y Empleados, para poder hacer un INNER JOIN debes tener a lo menos en la tabla empleados los id de las otras 4 tablas, por ejemplo, 1 empleado, tiene uno o n cargos, también tiene uno o n niveles, uno o n áreas uno o n fondos, ahora me gustaría si te puedes conectar a msn o enviarme la base datos más actualizada que tengas por que lo que estoy entendiendo de lo que quieres, es consultar a la base datos que para un empleado te muestre:
  - El cargo
  - El nivel
  - El área
  - Los fondos
Para esto debes tener relacionadas todas las tablas que me mencionas, por que de no ser así el INNER JOIN no encontrara lo que solicitas, faltan ID para poder hacer el cruce y juntar todo y te muestre un solo resultado.
Buenas tardes, antes gracias por su respuesta, la idea de la base de datos que tengo es almacenar los cargos y los fondos en tablas independientes para luego, desde la tabla asignaciones guardar la información correspondiente a cada empleado, porque como usted vera, un empleado puede tener, a lo largo de su vida laboral, más de un fondo y más de un cargo, para lo cual necesito relacionar el fondo y cargos iniciales y el fondo y cargos actuales, esa es la razón del porque no tengo vinculadas las tablas cargos y fondos con la tabla asignaciones, ya que se necesita un Id para hacerlo y en este caso los campos de fondos y cargos, iniciales y actuales, son dos datos que se llaman de las mismas tablas, osea, las tablas fondos y cargos. Por lo que me pide de la base de datos actualizada, la que le envíe es con la que trabajo y, desde el formulario asignaciones, que se localiza en el menu empleados, es desde donde ingreso la información correspondiente cuando llamo a cada empleado.
Por favor oriénteme sobre que debo hacer al respecto...
Esta muy bien lo que haces y también lo que me comentas, la verdad es que tu quieres tener una linea de tiempo con el empleado, quieres saber que fondo y cargo tuvo en POR tiempo, que fondo y cargo tienes después de POR tiempo, en el fondo las tablas de Cargo y fondo son solo tablas de consulta, ¿pero cómo sabes a que empleado corresponde ese cargo? ¿O ese fondo? No se si me entiendes, la verdad respeto mucho lo que me dices pero también debes tener claro que al momento de hacer las consultas a la base de datos, debes saber lo que la base de datos quieres que te muestre, si bien es cierto el empleado va a tener distintos cargos y fondos, pero esa información deberías mantenerla en el tiempo, en las tablas cargo y fondos, para así llevar la historia de los empleados.
Buenas tardes, la verdad no le entendí muy bien lo que me quiere decir, pero lo cierto es que usted si me entendió a mi, sobre su pregunta de saber a que empleado corresponde que cargo o que fondo, lo hago a través de la tabla asignaciones, ya que una vez ingresada la información a través del formulario asignaciones la base de datos debe estar capacidad de diferenciar estas cosas, el problema del tiempo da solución en el mencionado formulario asignaciones, ya que el mismo tiene en las pestañas cargos y fondos la fecha de asignación de cada concepto.
Lo que necesito que me ayude ha realizar es a que una vez yo selecciones un empleado me muestre los valores respectivos de cargos, fondos, área y nivel, si lo tiene y si no me muestre los valores en blanco para yo poder ingresarlos. El Problema esta en que cuando selecciono un empleado que no tiene asignado nada me genera el error del que le vengo hablando hace rato.
Nuevamente le pido el favor que me oriente en este caso y estaré atento a su respuesta...
Es muy fácil lo que quieres hacer estuve revisando tu código fuente, me costo una enormidad entenderlo, pero creo que debes hacer modificaciones en el código fuente y en la base de datos, para empezar lo que tienes esta bien pero si le preguntas IsNull y tiene dato nunca va a entrar a ese if, debería ser if not IsNull, ahí entra, pero creo que deberías proyectar un poco más lo que es la query que estas haciendo, en la tabla asignaciones, primero, le estas asignando n veces un idasignacion al mismo id empleado, te generara una confusión muy grande al momento de las consultas, segundo, creo que deberías replantearte el tema de las relaciones que hiciste entre las tablas, lo que debes hacer es relacionar la tabla empleado con la tabla asignaciones, solo eso por que al hacer clic en el mach de los campos me pregunto por que campo quería que me mostrara, revisa eso también, pero en lo personal te quiero felicitar por la labor que estas ejecutando te esta quedando de maravilla tu proyecto, pero hay cosas en las cuales deberías hacer un análisis más profundo.
Trata de explicar mejor lo que estas haciendo en el proyecto a modo de comentarios.
Cualquier cosa me la preguntas sabes que estoy para ayudarte
Suerte
Buenas tardes experto, le agradezco el que me haya respondido tan rapido, sus comentarios me parecen buenos, pero al hacer el cambio en el If por If Not, se me sigue presentando el mismo error, es decir, El Valor de BOF o EOF es True, o el actual registro se elimino; la operación solicitada requiere un registro actual.
Por otro lado su segunda apreciación es cierta, ya replantee la BD, por lo de las relaciones en las tablas Asignaciones y Empleados.
Por favor oriénteme sobre que debo hacer al respecto...
lo que debes hacer es preguntar si el valor no es true, o sea
if not recordset.EOF = True then
acciones
else
msgbox "el valor no existe"
end if
aqui le decimos que si recorset.EOF = False que efectue las acciones de lo contrario que envie un mensaje en pantalla. Con respecto a la base de datos la forma que deberia ser la siguiente, en la tabla asignaciones debes guardar toda la informacion que estas cruzando o juntando, desde las otras tablas, si bien es cierto la tabla cargo y fondo son solo tablas de consulta, a que me refiero con esto, que solo iras a esas tablas para agregar el fondo y el cargo nuevo cuando esto corresponda, pero para la asignacion si los datos son nuevos que los almacene con un insert normal, ahora si la persona lleva x años trabajando en la empresa y es asendido a otro cargo es ahi donde tu debes hacer el cruce con las tablas empleado, area, nivel y asignacion, pero para esto debes agregar a cada tabla el id del empleado, para que al momento de hacer la busqueda y el INNER JOIN tengan relacion para hacer los cruces, planteate esto de la siguiente manera:
1 empleado puede tener 1 o más cargos en el tiempo,
1 empleado puede tener 1 fondo en el tiempo
1 empleado puede tener 1 nivel en el tiempo
y esto donde queda almacenado en la tabla asignaciones, desde ahí se sabrá el historial del empleado, pero al momento de hacer las atualizaciones ahí es donde debes mantener el historial ademas tienes que identificar cual de los cargos es el que esta activo, por eso te decía que en la tabla asignaciones tienes muchas asignaciones a 1 solo empleado, pero puedes filtrarla agregando un campo más llamado activo con dos valores SI para el cargo activo y NO para el cargo inactivo, entonces al momento de hacer las consultas a la base de datos le dices que te muestre todos los datos del empleado, pero, donde el campo activo sea igual a "SI" así haces la consulta y llegas más fácil a los resultados esperados. Recuerda que para cada tabla debes tener el idempleado para hacer los INNER JOIN si quieres juntar la información debe tener el mismo nombre del campo.
Buenas tardes, la verdad aun no le entiendo lo que me quiere decir, si es posible por favor recreeme un ejemplo donde le pueda comprender mejor y pueda analizar sus apreciaciones, ya que así me resulta algo complicado, recuerde que le dije que mi nivel en visual basic es un poco básico. Tratare de analizar lo que me recomienda.
Nuevamente espero sus comentarios y gracias por su ayuda...
Estoy haciendo un INNER JOIN en la base de datos que me mandaste, no le he hecho ninguna modificación a las tablas y me esta funcionando lo que quieres, si puedes te conectas y lo conversamos.
Esto es un INNER JOIN:
SELECT asignaciones.cargo_inicial,
asignaciones.cargo_actual,
asignaciones.fecha_cargo,
asignaciones.fondo_inicial,
asignaciones.fondo_actual,
asignaciones.fecha_fondo,
asignaciones.idarea,
asignaciones.idnivel,
empleados.nombres,
empleados.apellidos
FROM (Empleados
INNER JOIN Asignaciones ON Empleados.IdEmpleados = Asignaciones.IdEmpleado)
WHERE idempleado=4
Copia esto en la base de datos y fíjate lo que hace, no le hice ninguna modificación a la base de datos original
Y para mejor aun, ya tengo la solución a tu problema, disculpame si te enrede mucho, pero ya esta funcionando, te mando el proyecto a tu casilla de mail para que la analices, te detallo los cambios y cosas nuevas que agregue:
Agregue un nuevo recordset para el INNER JOIN que cree,
hice modificaciones el form llamado CargarEmpleadoForm, sale explicado donde hice los cambios y el porque,
chequea tu module de sentencias, donde tienes los querys, ahí esta el INNER JOIN que cree se llama InnerJoin_Asig.
Te mando el proyecto con las modificaciones para que las hagas tu en el tuyo y sepas en donde se encuentra ubicado todo.
Suerte
Buenas tardes experto, recibí su correo pero el archivo fue removido no se la razón, por favor reenviemelo para realizar el análisis del que me cuenta.
Gracias por toda su ayuda...
Te reenvíe lo solicitado, si puedes conectarte a msn seria ideal también yo estoy en linea
Buenas noches, experto le cuento que recibí nuevamente su correo pero en iguales condiciones del anterior, no descarga nada...
Tratare de conectarme al msn para que me lo envíe...
Gracias
Estmado si tienes otro mail para enviarte la información, envíamela
Ya tengo el INNER JOIN para que lo veas desde access, ahora no puedo ver lo que estas haciendo ya que no estoy en mi casa...
Copia esto en access
select empleados.idempleados,
empleados.nombres,
empleados.apellidos,
asignaciones.cargo_inicial,
asignaciones.cargo_actual,
asignaciones.cargo_inicial,
asignaciones.fecha_cargo,
asignaciones.fondo_inicial,
asignaciones.fondo_actual,
asignaciones.fecha_fondo,
area.area,
nivel.nivel
from (empleados
INNER JOIN (asignaciones INNER JOIN area ON asignaciones.idarea = area.idarea) ON empleados.idempleados = asignaciones.idempleado)
INNER JOIN nivel ON asignaciones.idnivel = nivel.idnivel
where empleados.idempleados = 1
disculpa la demora pero al igual que tu he tenido mucho trabajo, que estes bien, por mi parte lo voy a probar desde el proyecto que tengo en mi poder, de ser asi lo envio y lo revisas cuidate
Buenas noches expertos, primero gracias por la respuesta que me ha dado es lo que estaba buscando, la verdad me ha costado demasiado comprenderlo para poder construir otro, aun no entiendo la cadena del inner join pero ya me coloque en la tarea de buscar información al respecto, si usted tiene información por favor hágamela llegar.
Esto lo aprendí en la ultima empresa que estuve al principio me costo entenderlo, pero con practica lo logre entender, entra en esta página http://www.aulaclic.es/sql/t_3_4.htm, ahí explican un poco espero te sirva.
Muchas gracias por sus orientaciones y el tiempo que se tomo en ayudarme a solucionar mi problema, espero seguir contando con su ayuda en las próximas ocasiones...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas