En este ejercicio he usado una tabla temporal para acelerar las operaciones de drag and drop. Teóricamente la tabla temporal en 1P no debería acceder al servidor, pero no es así, de hecho se registran transacciones aunque siempre con 0 operaciones. Por lo tanto, en cloud no resulta tan óptimo usar tablas temporales en 1P como en principio pudiéramos pensar.


Volviendo al ejercicio, cuando seleccionamos una Persona de la rejilla de la izquierda se copian a la tabla temporal (Tubo de lista) las Provincias asignadas a dicha Persona (relación plural Persona->Provincias), el campo ORDEN se rellena con el valor corespondiente. La tabla temporal se completa con las Provincias que no tiene asignadas la Persona seleccionada, en estos registros el campo ORDEN vale 0.


La tabla temporal tiene la siguiente estructura:

PERSONAS_PROV_TEMP  [ ID (N2), NAME (C35), PROVINCIAS (N2 puntero a maestro), ORDEN (N2) ]

Definimos 2 Índices por el campo ORDEN, uno ORDEN_SI con la condición ORDEN>0 y otro ORDEN_NO con la condición ORDEN=0


Para enteder el ejercicio vamos a fijarnos únicamente en las 2 Vistas de datos, Lista Origen y Lista Destino. Las 2 Vistas de datos contienen la misma Rejilla GRD_PROV, pero la de la izquierda se rellena con el Índice ORDEN_NO de la tabla temporal PERSONAS_PROV_TEMP  y la de la derecha con el índice ORDEN_SI.



En la rejilla GRD_PROV se ha definido un objeto Drop DROP_MOVER con Origen la tabla temporal PERSONAS_PROV_TEMP y proceso PRO_DROP con el siguiente código:



Rem ( El Origen de este proceso es la Provincia arrastrada, es una Lista de un solo registro )

Rem ( En el manejador Ficha drop se encuentra la Ficha sobre la que soltamos la provincia arrastrada.

  Es nula si soltamos en zona vacía )


If ( 1 )

  Rem ( Obtenemos la Provincia Origen del Drag&Drop )

  Seleccionar ficha por posición ( 1 )

  Leer ficha seleccionada

    // Mensaje ( "Provincia arrastrada: " + #PROVINCIAS.NAME, Información, , )

    Set ( NORDEN_ORIGEN, #ORDEN )


If ( 1 )

  Rem ( Obtenemos información de la Provincia sobre el que hacemos el Drop )

  Rem ( ¡OJO! La ficha Drop está en memoria. Las modificaciones que hagamos no se reflejan en disco )

  Procesar ficha en memoria ( Ficha drop )

  Set ( NID_DESTINO, #ID )

  If ( NID_DESTINO )

    Set ( NORDEN_DESTINO, #ORDEN )

  Else

    Rem ( Se pone al Final de la Lista de Ordenados )

    Set ( NORDEN_DESTINO, 900 )


If ( NID_DESTINO )

  Rem ( Hemos soltado encima de una Provincia )

  // Mensaje ( "Orden Origen: " + NORDEN_ORIGEN + " Orden Destino: " + NORDEN_DESTINO, Información, , )

  If ( NORDEN_DESTINO > 0 )

    Rem ( NORDEN_DESTINO > 0 cuando se arrastra desde la Lista Origen o dentro de la Lista Destino )

    Rem ( Hacemos hueco en la Lista de destino incrementando el #ORDEN )

    Cargar lista ( PERSONAS_PROV_TEMP@0PS_Varios_dat, ORDEN_SI, , , , )

      Invertir lista

      Recorrer lista lectura/escritura

        If ( #ORDEN > (NORDEN_DESTINO - 1) )

          Modificar campo ( ORDEN, #ORDEN + 1 )


If ( (NORDEN_DESTINO > 0) | (NORDEN_ORIGEN > 0) )

  Rem ( Asignamos el nuevo Orden al Centro arrastrado )

  Seleccionar ficha por posición ( 1 )

  Modificar ficha seleccionada

    Modificar campo ( ORDEN, NORDEN_DESTINO )


Rem ( Aquí tenemos una Lista Ordenada pero sin valores consecutivos )

Rem ( Ponemos valores consecutivos en el evento Drop finalizado )




Sobre las 2 Vistas de datos hemos definido un Manejador REFRESCAR_ORDEN para el evento Drop finalizado de tal forma que una vez arrastrada la Provincia de una Vista de datos a otra el campo ORDEN se ordenará consecutivamente.



Manejador de evento: REFRESCAR_ORDEN

Rem ( Después del Drop se recalcula el campo ORDEN de la lista de Provincias ordenadas )

Rem ( LMODIFICADO es 1 para activar los Botones de Guardar y Cancelar )

Set ( LMODIFICADO, 1 )

Rem ( Recargamos las Listas de Origen y Destino )

Interfaz: Recalcular ( GRD_PROVINCIAS_SINORDEN )

Interfaz: Recalcular ( GRD_PROVINCIAS_PER_CONORDEN )

Libre

Rem ( Asignamos un ORDEN consecutivo a la Lista de destino )

Rem ( Esta operación se realiza sobre una Tabla temporal en 1P )

Rem ( Observad que se genera transacción en el Servidor aunque con 0 operaciones )

Interfaz: Procesar ( GRD_PROVINCIAS_PER_CONORDEN, Todas )

  Set ( NCONTADOR, 1 )

  Recorrer lista lectura/escritura

    Modificar campo ( ORDEN, NCONTADOR )

    Set ( NCONTADOR, NCONTADOR + 1 )

  Ordenar lista ( #ORDEN, , , , , )

Libre

Set ( LOK, fun:FUN_MOSTRAR_STATUSBAR@0PS_Varios_app.app("Listas actualizadas", 2) )

Interfaz: Establecer foco ( GRD_PROVINCIAS_SINORDEN )



Ya solo nos queda Guardar la tabla temporal en la tabla de disco sincronizando el campo ORDEN.



Created with the Personal Edition of HelpNDoc: Easily create Web Help sites