Duplicar un registro de un formulario

Discute sobre las herramientas de la base de datos
Responder
ALBARRAN7
Mensajes: 27
Registrado: Jue Dic 14, 2017 2:38 am

Duplicar un registro de un formulario

Mensaje por ALBARRAN7 »

Buenos días, debo ser y soy un zoquete o como se llame.
Planteo mi pregunta, resulta que necesito tras visualizar los datos en un formulario, apretar un boton de macro y me duplique ese mismo registro y visualizarlo con otra ID, el caso es qu he estado buscando por el foro y he probado y no me sale quisiera buscar primero el registro por NIF de estudiante, y apretar el boton y me lo duplique, para despues hacer las modificaciones en cualquiera de los campos que desee no sean iguales. He vito que abriendo la tripas a la base, es decir visualizando los datos de la tabla en cuestión selecciono y suelto y se copia un nuevo registro por otro lado, he probado alguna macro pero en las variables me pierdo.
a ver si algún alma caritativa me puede ayudar.
Un saludo.
la macro que he probado es la siguiente:

Código: Seleccionar todo

Sub nuevoRegistro()

   Dim sSQL As String
   Dim oStat As Object
   Dim sTit As String
   Dim sMsg As String
   Dim nNIF_ESTUDIANTE As Texto
   Dim Vfecha SOLICITUD As Date
   
With ThisDatabaseDocument.CurrentController
      If Not .IsConnected Then .Connect
      oStat=.ActiveConnection.CreateStatement
   End With

   On Error Goto ErrorImporta
   
   nNIF_ESTUDIANTE = CInt(InputBox ("Escriba el número de DNI. Del Estudiante:","Atención"))

Vfechasolcitud = Date

   'Insertamos el nuevo registro en la tabla ESTUDIANTE
   'sSQL="INSERT INTO ""ESTUDIANTE""(""EMPLEO"",""NIF"",""NOMBRE_APELLIDOS"",""DESTINO""TLF_PARTICULAR"",""TLF_OFICIAL"",""C_ELECTRONICO"",""ACEPTA_RESIDENCIA"",""NIF_ESTUDIANTE"",""NOMBRE_APELLIDOS_ES"",""FECHA_NACIMIENTO"",""TLF_ESTUDIANTE"",""C_ELECTRONIO_ES"",""ESTUDIOS QUE CURSA"",""ASISTENCIA_AÑO_ANTERIOR"",""HABITACION"",""FECHA_OCUPACION"",""FECHA_DESALOJO"",""ANTI_SOLICITUD"",""ANTI_CONCESION"",""ANTI_OCUPACION"",""OBSERVACIONES"",""PARENTESCO"",""AÑO_FACTURA"",""FOTOGRAFIA"",""ANO_LECTIVO"",""ADMITIDO"",""FECHA SOLICITUD"",""FECHA_RENUNCIA"",""RENINCIA"") VALUES (" & Nnif_ESTUDIANTE & "," & Ffecha solicitudHSQL(Now()) & ",True)"

oStat.ExecuteUpdate(sSQL)

   On Error Goto 0

   sTit="Inserción de registro"
   sMsg="El duplicado de registro se ha realizado con éxito."
   MsgBox sMsg,MB_ICONINFORMATION,sTit
   Exit Sub

   ErrorImporta:
   sMsg="Ocurrió un error mientras se insertaba el nuevo registro."
   sMsg=sMsg & Chr(13) & Chr(13) & "Error " & Err & " en línea " & Erl & ":" & Chr(13) & Error$
   MsgBox sMsg,MB_ICONEXCLAMATION,"ERROR"
   On Error Goto 0
   
End Sub
OpenOffice 4.1.3 en windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Duplicar un registro de un formulario

Mensaje por Longi »

Buenas!

Como siempre, cuando uno escribe una pregunta le resulta clarísimo lo que pide, y que da información de sobra. Bien!, creo tener claro lo que pides, pero necesitaría saber cual es la clave principal y de qué tipo es.
Si es como supongo, detecto una arquitectura que pudiera ser que no fuese muy lógica, ya que parece que el mismo sujeto tiene varios registros en la misma tabla, con muchos datos iguales, aunque alguno puede variar. ( Si has seguido los pasos habituales habrás usado una clave principal integer y autonumérica, cuando lo mejor sería haberla hecho por DNI.)
Si estoy en lo cierto, lo suyo sería una tabla con los estudianes (DNI, Nombre, Apellidos, Tfno, Fecha de nacimiento, o cualquier otro campo que no varíe), y luego en una tabla relacionada se ponen todas las circunstancias que pueden variar a lo largo de la vida, relacionándose con clave primaria- clave foránea, como te indico más arriba, con el DNI.
Si ya no hay manera de echar marcha atrás (cosa que ya me pasó a mi), entonces se puede aplicar algo similar a esto:

Código: Seleccionar todo

Sub BuscarCIF(Evento As Object)
    '----------------------------------------------------------
    ' 0º Declaramos las variables
    
    Dim oForm As Object
    Dim CIF_NIF As String,NOMBRE  As String, NOMBRECTL As Variant, APELLIDOSCTL As Variant, ENDEREZOCTL As Variant
    Dim REGACTL As Variant, CONCELLOCTL  As Variant, PROVINCIACTL As Variant, CPCTL As Variant
    Dim TRATOCTL As Variant, ATESCTL As Variant, AUTOS As Variant
    Dim Conn As Variant, oStat As Variant, oSQLQuery As Variant, oResultSet As Variant, Filas As Variant
    Dim Columnas As integer,j As Integer, AUTOSCTL As Object
    '-----------------------------------------------------------------------------------
    ' 1º Definimos los elementos con los que trabajar
    
    oForm=Evento.Source.Model.Parent                                                          ' Formulario en el que trabajamos
    DNI= oForm.getByname("DNI").CurrentValue                                                  ' Valor en el control llamado DNI
    DNICTL= oForm.GetByName("DNI")                                                            ' Control llamado DNI
    NOMBRE = oForm.getByname("NOMBRE").CurrentValue                                           ' Valor en el control llamado NOMBRE
    NOMBRECTL=oForm.getByname("NOMBRE")                                                       ' Control llamado NOMBRE
    APELLIDOSCTL=oForm.getByname("APELLIDOS")                                                 ' Control llamado APELLIDOS
    DIRECCIONCTL=oForm.getByname("DIRECCION")                                                 ' Control llamado DIRECCION
    CONCELLOCTL=oForm.getByname("CONCELLO")                                                   ' Control llamado CONCELLO
    PROVINCIACTL=oForm.getByname("PROVINCIA")                                                 ' Control llamado PROVINCIA
    CPCTL=oForm.getByname("CP")                                                               ' Control llamado CP
    TRATOCTL=oForm.getByname("TRATO")                                                         ' Control llamado TRATO
    ATESCTL=oForm.getByname("ATES")                                                           ' Control llamado ATES
    AUTOSCTL = oForm.GetByName("FECHA DE AUTOS")                                              ' Control llamado FECHA DE AUTOS
    '-----------------------------------------------------------------------------
    ' 2º Establecemos un control de errores
 
    If NOMBRE <> "" Then                                                                      ' Si el campo NOMBRE tiene un valor, entonces....
    Exit Sub                                                                                  ' Abandonamos la macro
    End if                                                                                    ' Acabamos la condición

    If DNI ="" Then Exit sub                                                                  ' Si el DNI está vacío no sigue para adelante
    '-------------------------------------------------------------------------------
    ' 3º Hacemos una consulta para recuperar datos previos en la tabla ESTUDIANTE
    
    Conn = ThisDatabaseDocument.CurrentController.ActiveConnection                           ' Conectamos para recoger los datos de las tablas
    oStat=Conn.createStatement()                                                             ' Creación de la conexión
    oSQLQuery =  "SELECT ""DNI"", MAX( ""NOMBRE"" ), MAX( ""APELLIDOS"" ), MAX( ""DIRECCIÓN"" ), MAX( ""CONCELLO"" ), MAX( ""Provincia"" ), MAX( ""CodPost"" ), MAX( ""CódOperador"" ), MAX( ""CódTransportista"" ) FROM ""EXPEDIENTES"" GROUP BY ""DNI"" HAVING ( ( ""DNI"" = '" & DNI & "' ) )"
    oStat.setPropertyValue("ResultSetType",1005)                                             ' Características de la consulta
    oResultSet = oStat.executeQuery(oSQLQuery)                                               ' Se ejecuta la consulta
    oResultSet.last                                                                          ' Va al último registro para contar los registros que tiene
    Filas = oResultSet.Row                                                                   ' Añade la variable con el número de registros devuelto 
    oResultSet.first                                                                         ' Mueve el cursor al primer registro
    oResultSet.previous 
    Columnas= oResultSet.Columns.Count                                                       ' Número de columnas que tiene el resultado de la consulta
    '-----------------------------------------------------------------------
    ' 4º Establecemos un array que recoge todos los datos de la consulta
    
    j = 0                                                                                    ' Constante
    Dim RowArray()                                                                           ' Definición del array  
    While oResultSet.next                                                                    ' Recorremos todos los datos del Resultset
    Redim Preserve RowArray(j)                                                               ' Redimensionamos el array
	RowArray(j) = oResultset.getString(1)                                                    ' Primer resultado del array
	j = j+1                                                                                  ' Pasa al siguiente resultado del array


	'-------------------------------------------------------------------------
	' 5º Copiamos los datos del array en los campos
	
	DNICTL.BoundField.UPDATEString (oResultSet.getString(1))                                 ' Dato a su control
	NOMBRECTL.BoundField.UPDATEString (oResultSet.getString(2) )                             ' Dato a su control
	APELLIDOSCTL.BoundField.UPDATEString (oResultSet.getString(3) )                          ' Dato a su control
	DIRECCIONCTL.BoundField.UPDATEString (oResultSet.getString(4) )                          ' Dato a su control
	CONCELLOCTL.BoundField.UPDATEString (oResultSet.getString(6) )                           ' Dato a su control
	PROVINCIACTL.BoundField.UPDATEString (oResultSet.getString(7) )                          ' Dato a su control
	CPCTL.BoundField.UPDATEString (oResultSet.getString(8) )                                 ' Dato a su control
	TRATOCTL.BoundField.UPDATEString (oResultSet.getString(9) )                              ' Dato a su control
	ATESCTL.BoundField.UPDATEString (oResultSet.getString(10) )                              ' Dato a su control
    Wend                                                                                     ' Rematamos el ciclo del ResultSet
    '-------------------------------------------------------------------------
    ' 6º Nos colocamos en el siguiente campo a rellenar
	                
'	AUTOSCTL=oForm.Parent.Parent.CurrentController.GetControl(AUTOSCTL)                      ' Nos situamos en el control FECHA DE AUTOS
'	AUTOSCTL.SetFocus                                                                        ' Colocamos el foco


End Sub
Lo que hago es aplicarlo al evento 'al perder el foco' en el campo DNI (es decir, sin botón). Recojo el valor del DNI que está en su textbox (oForm.getByname("DNI").CurrentValue), y marco todos los controles que serán copiados desde el último registro que, en este caso, el estudiante tenga (los terminados en CTL).
Después hago una consulta (creo que con no mucha fortuna, pero me funciona), en la que saco el máximo ( o último) de los registros que hay para ese DNI (tienes que adecuarla a tus necesidades, e incluso hacerla de nuevo, que seguro que hay algún SQL más lógico para hacer lo mismo).
Saco los datos en forma de ResultSet, pero solo tendrá una fila de datos.
Después coloco cada elemento del resultSet en el campo (acuérdate, los terminados en CLT) con un updateString en cada uno de ellos.

Entiendo que no es el colmo de la elegancia a la hora de programar, pero a mi me funciona!
De todos modos puede que esto no se adapte a lo tuyo, ya que como decía al principio, un pelín más de información vendría bien, y con un ejemplo ya sería bárbaro.

Ya contarás si te sirvió.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
ALBARRAN7
Mensajes: 27
Registrado: Jue Dic 14, 2017 2:38 am

Re: Duplicar un registro de un formulario

Mensaje por ALBARRAN7 »

muchas gracias, voy a probarlo, efectivamente la clave id es autonumerica e integer, por otro lado los datos primeros son los del padre y los segundo son los del alumno.
Lo pruebo y te cuento a ver que sale, pero basicamente lo que yo deseo es visualizar una ficha con sus datos y duplicarlas cambiando algunos datos, ya que el alumno y padre en cuestión puede repetir varios años por lo que únicamente algún dato de fecha habría solo que cambiar el año lectivo, ejemplo este año es 2017/2018 el siguiente 2018/2019, y así sucesivamente.
voy a ver que hace lo que me mandaste y te cuento
muchas gracias como siempre un saludo cordial.
OpenOffice 4.1.3 en windows 10
ALBARRAN7
Mensajes: 27
Registrado: Jue Dic 14, 2017 2:38 am

Re: Duplicar un registro de un formulario

Mensaje por ALBARRAN7 »

Dim nNIF_ESTUDIANTE As texto
Dim vFECHA SOLICITUD As Date
esta macro no funciona dice texto error de sintaxis y vFecha error de sintaxis.
yo solo deseo una macro me da igual la estructura que duplique otro registro igual que que esta, despues yo haré las modificaciones que sean necesarias a dicho registro.
Si es posible, claro está.
Un saludo.
OpenOffice 4.1.3 en windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Duplicar un registro de un formulario

Mensaje por Longi »

Buenas!

Lo que te puse es algo que me funciona a mi, con mis condiciones en concreto con respecto a los campos que yo tengo.
Quiero decir que para adaptarlo a tu caso, lo mejor sería que colgases un ejemplo, con datos ficticios, pero con los campos que realmente trabajas, y así podremos adaptarlo.
Seguramente sea que en vez de UpdateString haya que utilizar Date, o alguna transformación específica.
También puedes usar la macro para un solo campo, de tal manera que al rellenar el DNI y salir de él te rellenase el nombre, e ir probando con los distintos campos.
Si da problemas en el DNI quizá utilizaste un campo numérico y no estás utilizando la letra. Recuerda que String se refiere en este caso a una cadena de texto.
Mira a ver si puedes colgar el ejemplo y le damos una vuelta.

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
ALBARRAN7
Mensajes: 27
Registrado: Jue Dic 14, 2017 2:38 am

Re: Duplicar un registro de un formulario

Mensaje por ALBARRAN7 »

adjunto base de datos
lo que deseo es duplicar el registro y lugo yo en el registro duplicado cambiar el los campo que desee con el año lectivo
Gracias y u saludo.
Adjuntos
estudiantes.rar
base a duplicar
(11.62 KiB) Descargado 132 veces
OpenOffice 4.1.3 en windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Duplicar un registro de un formulario

Mensaje por Longi »

Buenas!
La macro funciona bien, como he puesto en tu ejemplo. Lo único es que tiene tanto campo que solo hice que repitiese unos cuantos, incluyendo fechas y teléfonos (campos formateados), así que tendrás que rematarla tu.
La he puesto de tal manera que al escribir un DNI (que debe ser del padre) y sales de él, si existe uno igual, entonces repite los datos del último registro de ese DNI ( pones 'aaaaa' en un registro nuevo y al salir de allí ya te pega todos los datos). Ya sé que lo querías con botón, pero a mi me gusta más así. Si quieres el botón lo adaptas (creo que no dará mayores problemas).
Cuando el Nombre (supongo que del padre) está ocupado entonces no avanza (nos echa de la macro), y lo mismo si el DNI está ya ocupado de antes (de tal manera que si estás en un registro ya cubierto-DNI incluído- no se dispare la macro).

Espero que te funcione!

Un saludo! :)
Adjuntos
estudiantes.7z
(15.78 KiB) Descargado 152 veces
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
ALBARRAN7
Mensajes: 27
Registrado: Jue Dic 14, 2017 2:38 am

Re: Duplicar un registro de un formulario

Mensaje por ALBARRAN7 »

gracias longi, lo mirare y te cuento, si puedo suprimir la duplicación de fechas lo haré, porque esos son unos campos que al duplicar el registro deben ir todas nuevas.
Ya te cuente
Un abrazo y muchas gracias.
OpenOffice 4.1.3 en windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Duplicar un registro de un formulario

Mensaje por Longi »

Si las fechas no las contemplas en la orden SQL y no las pones en el listado siguiente, ya no entrarán (igual que no han entrado todos los campos que no adjunté porque me aburrí de meter más).
En este momento es cuando uno puede pensar que quizá el diseño de la base no es el mejor: Posiblemente seguro, que era mejor una tabla con todos esos datos que se repiten (DNI, dirección, Nombre........), luego otra con los datos que varían y ambas relacionadas por clave principal-secundaria.
De ese modo solo tendrías que meter los datos 'repetibles' una vez, y en la otra tabla solo los variables. Harías un formulario con la tabla de 'repetibles' y un subformulario con 'variables'.
Piensa que en una base de andar por casa quizá no sea importante, pero para una base con muchos registros ya no es el trabajo de teclear datos que ya se tienen (poniendo la herramienta que hemos puesto no lo tienes que hacer tu, sino la máquina), el problema es el uso de espacio y aumento de tamaño de la base con datos que no es necesario repetir. Y en base, uno de los defectos que tiene es que cuando aumenta mucho el tamaño y si la arquitectura no es la mejor, entonces se corrompe con bastante facilidad.

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Duplicar un registro de un formulario

Mensaje por RMG »

Hola,

Como bien te dice el amigo Longi, para mi también es un problema de diseño de la BD. Debes separar los datos que van a ser fijos siempre de los que pueden variar. Además no te recomiendo usar el campo imagen en una tabla, esa imagen siempre la puedes obtener desde un directorio y no necesitas cargar tanto la BD.

Me he tomado la libertad de hacerte un ejemplo de como se puede diseñar, por supuesto cada uno tiene su sistema. Como veras tu tabla la he dividido en varias más y siempre con un campo que las relacione. En un solo formulario lo he puesto todo, para que lo veas a simple vista, aunque lo suyo es diferenciar los datos en varios formularios. De esta forma no es necesario duplicar nada, solo debes ir llenando los campos que deben variar en cada curso y sin necesidad de macro. Respecto a la factura, no es necesario poner campos que se pueden obtener con los datos de otros, ejemplo año y mes. Esto no es solo para las facturas, en general es para todo, si una formula lo puede hacer por ti por que perder el tiempo.

Respecto a las imagenes del estudiante, si que es necesaria una macro, te la he puesto para que lo veas, ademas de una carpeta donde alojarlas. Espero que te sirva para entender un poco mejor como diseñar una BD.

Puede que falte algún campo o que alguno de los que he puesto no refleje lo que quieres, pero debes entender que lo que he hecho es simplemente deducir lo que pretendes hacer, si es el caso solo debes modificar o añadir lo necesario. Recuerda que lo principal de este comentario, es que puedas entender mejor como diseñar una BD.

https://mega.nz/#F!MklSyYCK!9KmRlmqmkT-CPNEeq_ysqA

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Responder