Eliminar un registro de una lista


([N1] practicasvelneot2) #1

Hola a todos,

Me encuentro aprendiendo el funcionamiento del programa y en este momento estoy haciendo un simple formulario de registro de alumnos en una lista. Dicha lista se puede visualizar con una rejilla y a través de un localizador se puede encontrar determinado alumno en la lista.

Para eliminar un elemento de la lista tengo en el formulario un botón ELIMINAR que me permite eliminar el alumno que visualizo, pero cuando quiero eliminar el alumno directamente viendo la lista y pulsando el botón suprimir, por alguna razón que no entiendo el programa hace como si le hubiera dado doble click para modificarlo, cuando mi intención dándole a la tecla Supr es eliminarlo de la lista y no modificarlo.

He estado echando un ojo a cómo funciona el tema de las listas, pero no he conseguido aclarar mis dudas respecto a lo que quiero hacer. Espero haber podido explicarme.

He conseguido crear y entender medianamente cómo funcionan los manejadores de eventos y las conexiones, y he conseguido crear un pequeño manejador en el que realizo determinadas restricciones cuando quiero introducir a un alumno en la lista desde el formulario, como por ejemplo, que el nombre se ponga en mayúsculas o que el correo sea correcto, todo a través de expresiones regulares.

No sé si lo de eliminar a un alumno visualizando la lista con la tecla Supr se haría también desde un manejador o desde dónde.

Espero que podáis echarme un cable.

Muchas gracias!


([N2] AyudaVelneo) #2

Hola:

Cuando pulsas el botón insertar, haces doble click en la rejilla o pulsas el botón suprimir, lo que te lanza son los formularios que tengas asociados en la rejilla a la propiedad “Formulario de alta”, “formulario de modificación” o “Formulario de baja”.

A partir de ahí ya puedes editar o eliminar el registro (pulsando el botón eliminar).

Puedes hacer un formulario para “Eliminar” el registro en el que muestre un mensaje o algún campo del registro y poner simplemente un botón eliminar (con el comando correspondiente) y un botón cancelar.

Un saludo


([N1] practicasvelneot2) #3

Muchas gracias por la respuesta!

En el formulario tengo un botón eliminar que me elimina el registro si pulso dicho botón.

Lo que me interesa en que cuando esté en la rejilla y pulse el botón suprimir, directamente se elimine dicho registro y no que me lleve al formulario de nuevo

¿Eso se puede hacer?


([N1] practicasvelneot2) #4

Al final he creado 3 formularios distintos, uno para crear, otro para modificar y otro para eliminar, y en la tabla correspondiente le he dicho que la Ficha de Alta sea Alumnos_crear, Ficha de modificación sea Alumnos_modificar y Ficha de baja sea Alumnos_eliminar.

Me surgía otra duda que al final he conseguido solucionar por si le puede servir a alguien:
Necesitaba poner claves únicas, para que dos alumnos no pudieran tener el mismo email asociado, por lo que he creado un nuevo índice en la base de datos llamado email donde en la propiedad tipo de índice le he puesto única y le he adjuntado un subobjeto PARTE ÍNDICE al que le he asociado el campo EMAIL.

Aún así sigo sin conseguir que al pulsar la tecla suprimir se elimine directamente, sin tener que pasar por el formulario, ¿hay alguna forma de conseguirlo? Quedándose en la lista tras suprimirlo claro

Muchas gracias!


([N3] pacosatu) #5

Hola practicasvelneot2.

¡Claro que puedes eliminar un registro pulsando la tecla Suprimir!
Solo tienes que capturar la pulsación de la tecla en la Rejilla correspondiente.

  • Edita el objeto Rejilla
  • Añade las variables especiales (opción menú Objetos -> Crear variables locales eventos
  • Crea unn conexión de evento para capturar la “Tecla soltada” y asócialo a
  • Manejador de evento BORRAR_REG con el siguiente código:

If ( numberToString(EVENT_PARAMS[1], "f", "g") = "16777223" )
  Pregunta ( "Confirma el borrado de la Ficha", LOK, )
  If ( LOK = 0 )
   Finalizar proceso
  Interfaz: Procesar ( , Seleccionadas )
    Recorrer lista eliminando fichas
      Mensaje ( "Se ha eliminado la ficha: " + #ID, Información, , )

En las Rejillas, por defecto, la tecla Suprimir dispara el formulario asociado a la propiedad Formulario de eliminación. Si esta propiedad está vacía, la pulsación de la tecla no hace nada y por esa razón tienes que capturarla y asignar tu propio código.

Saludos
Paco Satué


([N1] practicasvelneot2) #6

Funciona perfectamente! Muchas gracias a los dos!!

Permitirme por curiosidad que os comente, a pesar de que funcione, no entiendo la razón de por qué en la sentencia numberToString(…,“f”, “g”) ¿Qé quieren decir f y g? Veo que hacen referencia a formato y decimal pero no sé por qué f y g.

Por otro lado, el código de la tecla que pulso, ¿cómo lo sabéis?, ¿hay algún sitio donde vengan todos los códigos de las teclas?

Y por último, he estado ojeando por el foro el poder actualizar la rejilla en cuanto suprimo la ficha pero no veo nada que me ayude. Veo que hay un Interfaz:Recalcular() pero no me deja meter la rejilla dentro. ¿Es esa la vía o hay alguna otra?

Muchas gracias de nuevo!


([N3] pacosatu) #7

Hola practicasvelneot2.

La función numberToString(<numero>,[fgGeEL],<n>) lo que hace es devolver una cadena formateada como un número y n decimales. Perdona, el ejemplo está erróneo.

Hay 2 casos que son los más habituales:

  • numberToString(EVENT_PARAMS[1],“f”,0) = “16777223” devuelve el número sin separadores de miles y en este caso con 0 decimales
  • numberToString(EVENT_PARAMS[1],“L”,0) = “16.777.223” devuelve el número según la configuración de la máquina, en mi máquina los separadores de miles son el punto.

La lista de Códigos de tecla debe ser como el Santo Grial. Yo también me hice con el PDF cuando tuve la oportunidad.

Cuando usas Interfaz:Recalcular() dentro de la Rejilla no es necesario indicar el identificativo de dicha Rejilla, se queda en blanco y Velneo interpreta que debe Recalcular la misma Rejilla. De todas formas la Rejilla no se puede Recalcular, solo las Vistas de Datos, que sí tienen un proceso previo que las alimenta de fichas. Ese efecto de ver el registro en blanco cuando se borra es normal. Coloca la Rejilla en una Vista de Datos de un formulario y asocia el evento de Tecla Supr a la Vista de datos y entones podrás hacer Recalcular:(VISTADATOS).

Finalmente y ya que no tenemos Ayuda en línea para los códigos de tecla, yo he creado una Función JavaScript que facilita la consulta de pulsaciones de tecla y evita la chapuza del numberToString.


// Función tecla_ObtenerCodigo() - devuelve el código de la tecla pasado como parámetro
// Se puede ir completando la lista con más códigos
// Parámetros:
//      cTecla - string con el nombre de la tecla
function tecla_ObtenerCodigo(cTecla) {
	var teclas = {
	'-- no existe --':0,
	'Space':32,
	'Escape':16777216,
	'Tab':16777217,
	'Backtab':16777218,
	'Backspace':16777219,
	'Return':16777220,
	'Enter':16777221,
	'Insert':16777222,
	'Delete':16777223,
	'Pause':16777224,
	'Print':16777225,
	'SysReq':16777226,
	'Clear':16777227,
	'Home':16777232,
	'End':16777233,
	'Left':16777234,
	'Up':16777235,
	'Right':16777236,
	'Down':16777237,
	'PageUp':16777238,
	'PageDown':16777239,
	'F1':16777264,
	'F2':16777265,
	'F3':16777266,
	'F4':16777267,
	'F5':16777268,
	'F6':16777269,
	'F7':16777270,
	'F8':16777271,
	'F9':16777272,
	'F10':16777273,
	'F11':16777274,
	'F12':16777275
	};
	if (cTecla in teclas) {
		return teclas[cTecla].toFixed(0);
	};
	return teclas['-- no existe --'].toFixed(0);
};

Creamos una función Velneo que oculta la llamada al API


Funcion: FUN_TECLA_OBTENER
   Rem ( Devuelve el código de la Tecla especificada )
   Set ( CODIGO_TECLA, /*JAVASCRIPT*/#include "4dr03ul4.vca/_MisFunciones.js"
         tecla_ObtenerCodigo(theRegister.varToString("TECLA")); )
   Set dato de retorno ( CODIGO_TECLA )

Por ejemplo, si queremos saber si han pulsado Enter, Return o Barra Espaciadora


if ( (EVENT_PARAMS[1] = fun:FUN_TECLA_OBTENER@Miapp.app("Enter")) |
     (EVENT_PARAMS[1] = fun:FUN_TECLA_OBTENER@0Miapp_app.app("Return")) |
     (EVENT_PARAMS[1] = fun:FUN_TECLA_OBTENER@Miapp.app("Space"))
)

Saludos
Paco Satué


([N1] practicasvelneot2) #8

Te agradezco mucho la información. Ahora ya me queda más claro cómo funciona numberToString(…) =)

Por otro lado ya he conseguido actualizar la rejilla cuando desde la misma pulso el botón SUPR para eliminar un dato. Simplemente al final del manejador he añadido una nueva línea en la que utilizo la instrucción Ordenar Lista, que en mi caso quiero que la ordene por nombre.
De esta forma la rejilla se actualiza en el mismo momento en que acepto suprimir el dato. Supongo que realmente no es que se actualice, sino que ordena los datos en función del campo que le pido ordenar, lo que obliga a que se actualice.

Esta solución seguro que ayuda a más de uno así que voy a subir la captura del código del manejador

Y si quiero que en cuanto yo añada un nuevo alumno, aparezca la rejilla con los datos, he pensado en lanzar una instrucción en el manejador, el de Lanzar Acción, pero no veo que me lance la lista por ningún lado. ¿Tenéis idea de cómo puedo hacer aparecer la rejilla tras una nueva alta en el formulario?



([N1] JE) #9

Paco, el evento para recoger la tecla pulsada en la rejilla me ha venido al pelo.

Sólo indicar que DELETE es 16777219 y SUPR 16777223.

Muchas gracias de nuevo y un saludo.