Introducir registros nuevos
Introducir registros nuevos
Buenas
Soy novato en esto de LibreOffice, y estoy creando una BD para tener controlado el material ferroviario que tengo (soy aficionado al modelismo ferroviario).
El caso que en un formulario introduzco los datos del material, y pulsando el botón de "Nuevo Registro", tendría que realizar unas series de acciones:
1ª Guardar el registro.
2ª Leer uno de los campos del registro y según su valor mediante la función IF realizar una pregunta con un cuadro de dialogo.
3ª Según la respuesta abriría otro formulario o simplemente se posicionaría al final de la tabla para introducir un nuevo registro.
Todo esto mediante una macro asignada a este botón. He realizado alguna pruebas pero como no domino, ni consigo dar con algún sitio donde me indique los servicios, interface... que existen y su función, pues no atino bien a como empezar.
Se que lo mejor es añadir a este post un ejemplo de lo que estoy realizando. Si me da tiempo intentare colgarlo en este hilo para que sepáis de lo que quiero, con una explicación mejor.
Agradecería tambien algún enlace, pdf…. donde pueda ver los servicios...… y de esa forma no estar continuamente preguntado.
Gracias por adelantado por vuestra ayuda.
Un saludo Josera
Soy novato en esto de LibreOffice, y estoy creando una BD para tener controlado el material ferroviario que tengo (soy aficionado al modelismo ferroviario).
El caso que en un formulario introduzco los datos del material, y pulsando el botón de "Nuevo Registro", tendría que realizar unas series de acciones:
1ª Guardar el registro.
2ª Leer uno de los campos del registro y según su valor mediante la función IF realizar una pregunta con un cuadro de dialogo.
3ª Según la respuesta abriría otro formulario o simplemente se posicionaría al final de la tabla para introducir un nuevo registro.
Todo esto mediante una macro asignada a este botón. He realizado alguna pruebas pero como no domino, ni consigo dar con algún sitio donde me indique los servicios, interface... que existen y su función, pues no atino bien a como empezar.
Se que lo mejor es añadir a este post un ejemplo de lo que estoy realizando. Si me da tiempo intentare colgarlo en este hilo para que sepáis de lo que quiero, con una explicación mejor.
Agradecería tambien algún enlace, pdf…. donde pueda ver los servicios...… y de esa forma no estar continuamente preguntado.
Gracias por adelantado por vuestra ayuda.
Un saludo Josera
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Hola,
Metodos y servicios.
http://www.openoffice.org/api/docs/comm ... /XRow.html
Proyectos de BD para tomar ejemplos.
https://forum.openoffice.org/es/forum/v ... m.php?f=70
Tutorial de Base.
https://wiki.open-office.es/Base
Saludos
Metodos y servicios.
http://www.openoffice.org/api/docs/comm ... /XRow.html
Proyectos de BD para tomar ejemplos.
https://forum.openoffice.org/es/forum/v ... m.php?f=70
Tutorial de Base.
https://wiki.open-office.es/Base
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)
Re: Introducir registros nuevos
Buenas de nuevo
He visto la documentación que se me indicaba, mas otras que he indagado por internet, al final he montado una macro pero no consigo que funcione correctamente.
En esencia lo que busco hacer es lo siguiente:
Tengo dos tablas , una MODELO y otra CV, ambas relacionadas por el campo "Matricula". Al introducir un registro y pulsar el botón de NUEVO REGISTRO o SALIR, dos campos de la tabla MODELO (concretamente "Matricula" y "CV"), cree con ellos un nuevo registro en la tabla CV.
Como ya he dicho he montado la siguiente macro:
Option Explicit
Dim oDatos As Object
Dim txtMatricula As Object
Dim txtCV1 As Object
Sub CrearRegistro_TablaCV()
Dim Datos()
Dim co1 As Integer
Dim sTmp As String
Dim sSQL As String
Dim sMatricula As String
'Obtenemos el valor del cuadro de texto y le quitamos los espacios sobrantes
sMatricula = Trim(txtMatricula.getText())
'convertir en mayusculas
txtMatricula.setText( sMatricula )
If sMAtricula = "LOCOMOTORA" Then
'Obtenemos los datos de todos los cuadros de texto
Datos = Array( txtMatricula.getText, txtCV1.getText, )
'Agregamos las comillas simples
For co1 = LBound(Datos) To UBound(Datos)
Datos(co1) = "'" & Datos(co1) & "'"
Next co1
'Juntamos y separamos por coma
sTmp = Join( Datos(), ",")
'Construimos la instrucción SQL de inserción
sSQL = "INSERT INTO ""CV"" (""Matricula"",""CV1"") VALUES (" & sTmp & ")"
'Insertamos los datos
Call ActualizarDatos( oDatos, sSQL )
End If
End Sub
'Ejecuta la consulta de actualización pasada
Sub ActualizarDatos( BaseDatos As Object, SQL As String)
Dim oConexion As Object
Dim oDeclaracion As Object
Dim oResultado As Object
'Creamos una conexion a la base de datos
oConexion = BaseDatos.getConnection( "","" )
'Creamos un objeto para las instrucciones SQL
oDeclaracion = oConexion.createStatement()
'Ejecutamos la inserción de datos
oDeclaracion.executeUpdate( SQL )
End Sub
Pero al llegar a la linea:
sMatricula = Trim(txtMatricula.getText())
me da el error variable objeto no establecida. No se si puede ser por no inicializar algún método o evento, el caso es que ando un poco atascado en ello, si alguien puede darme una indicación de por donde solucionarlo se lo agradecería.
Un saludo
He visto la documentación que se me indicaba, mas otras que he indagado por internet, al final he montado una macro pero no consigo que funcione correctamente.
En esencia lo que busco hacer es lo siguiente:
Tengo dos tablas , una MODELO y otra CV, ambas relacionadas por el campo "Matricula". Al introducir un registro y pulsar el botón de NUEVO REGISTRO o SALIR, dos campos de la tabla MODELO (concretamente "Matricula" y "CV"), cree con ellos un nuevo registro en la tabla CV.
Como ya he dicho he montado la siguiente macro:
Option Explicit
Dim oDatos As Object
Dim txtMatricula As Object
Dim txtCV1 As Object
Sub CrearRegistro_TablaCV()
Dim Datos()
Dim co1 As Integer
Dim sTmp As String
Dim sSQL As String
Dim sMatricula As String
'Obtenemos el valor del cuadro de texto y le quitamos los espacios sobrantes
sMatricula = Trim(txtMatricula.getText())
'convertir en mayusculas
txtMatricula.setText( sMatricula )
If sMAtricula = "LOCOMOTORA" Then
'Obtenemos los datos de todos los cuadros de texto
Datos = Array( txtMatricula.getText, txtCV1.getText, )
'Agregamos las comillas simples
For co1 = LBound(Datos) To UBound(Datos)
Datos(co1) = "'" & Datos(co1) & "'"
Next co1
'Juntamos y separamos por coma
sTmp = Join( Datos(), ",")
'Construimos la instrucción SQL de inserción
sSQL = "INSERT INTO ""CV"" (""Matricula"",""CV1"") VALUES (" & sTmp & ")"
'Insertamos los datos
Call ActualizarDatos( oDatos, sSQL )
End If
End Sub
'Ejecuta la consulta de actualización pasada
Sub ActualizarDatos( BaseDatos As Object, SQL As String)
Dim oConexion As Object
Dim oDeclaracion As Object
Dim oResultado As Object
'Creamos una conexion a la base de datos
oConexion = BaseDatos.getConnection( "","" )
'Creamos un objeto para las instrucciones SQL
oDeclaracion = oConexion.createStatement()
'Ejecutamos la inserción de datos
oDeclaracion.executeUpdate( SQL )
End Sub
Pero al llegar a la linea:
sMatricula = Trim(txtMatricula.getText())
me da el error variable objeto no establecida. No se si puede ser por no inicializar algún método o evento, el caso es que ando un poco atascado en ello, si alguien puede darme una indicación de por donde solucionarlo se lo agradecería.
Un saludo
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Hola,
Mira en algún ejemplo que te sugiero, te falta crear la variable objeto para acceder al formulario y a través del modelo, poder acceder a algún control de este.
Si aportas un pequeño ejemplo te podremos ayudar mejor.
Saludos
Mira en algún ejemplo que te sugiero, te falta crear la variable objeto para acceder al formulario y a través del modelo, poder acceder a algún control de este.
Si aportas un pequeño ejemplo te podremos ayudar mejor.
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)
Re: Introducir registros nuevos
Buenas de nuevo
Aqui sigo dándole vueltas pero no consigo que arranque del todo. Adjunto un ejemplo de la base, es solo una prueba.
Básicamente lo que quiero es que al introducir un registro, si el valor del campo 'Modelo' es LOCOMOTORA, copie los campos 'CV1' y 'Matricula' de la tabla 'Modelo' en la tabla 'CV'. Ya digo que llevo varios dias leyendo y realizando pruebas pero no se si me estoy despistando en algún detalle. Si es asi por favor, espero que me lo aclaren para no caer mas en ese problema.
El código que tiene asociado el botón nuevo registro es el siguiente:
Option Explicit
Dim oDatos As Object
Dim txtMatricula As Object
Dim txtModelo As Object
Dim txtCV1 As Object
Sub CrearRegistro_TablaCV()
Dim oDBC as object
Dim oDlg As Object
Dim Datos()
Dim co1 As Integer
Dim sTmp As String
Dim sSQL As String
Dim sModelo As String
Dim sMatricula As String
'El servicio de bases de datos
oDBC = createUnoService("com.sun.star.sdb.DatabaseContext")
'Cargamos los controles en memoria
Call CargarControles( oDlg )
'Obtenemos el valor del cuadro de texto y le quitamos los espacios sobrantes
sModelo = Trim(txtModelo.getText())
'convertir en mayusculas
txtModelo.setText( sModelo )
If sModelo = "LOCOMOTORA" Then
'Obtenemos los datos de todos los cuadros de texto
Datos = Array( txtMatricula.getText, txtCV1.getText, )
'Agregamos las comillas simples
For co1 = LBound(Datos) To UBound(Datos)
Datos(co1) = "'" & Datos(co1) & "'"
Next co1
'Juntamos y separamos por coma
sTmp = Join( Datos(), ",")
'Construimos la instrucción SQL de inserción
sSQL = "INSERT INTO ""CV"" (""Matricula"",""CV1"") VALUES (" & sTmp & ")"
'Insertamos los datos
Call ActualizarRegistro( sSQL )
End If
End Sub
Sub CargarControles( Dialogo As Object)
Dim txtMatricula As Object
Dim txtModelo As Object
Dim txtCV1 As Object
With Dialogo
txtModelo = .getControl("txtModelo")
txtMatricula = .getControl("txtMatricula")
txtCV1 = .getControl("txtCV1")
End With
End Sub
Sub ActualizarRegistro( Evento )
Dim oCtrl As Object
oCrtl=com.sun.star.sdbc.xresultset.next ()
Form = Evento.Source.Model.Parent
oCtrl = Form.Parent.Parent.GetByName("Modelo")
MsgBox oControl
If Not Evento.Source.getModel.Parent.IsNew Then
Evento.Source.getModel.Parent.updateRow()
End If
End Sub
Aqui sigo dándole vueltas pero no consigo que arranque del todo. Adjunto un ejemplo de la base, es solo una prueba.
Básicamente lo que quiero es que al introducir un registro, si el valor del campo 'Modelo' es LOCOMOTORA, copie los campos 'CV1' y 'Matricula' de la tabla 'Modelo' en la tabla 'CV'. Ya digo que llevo varios dias leyendo y realizando pruebas pero no se si me estoy despistando en algún detalle. Si es asi por favor, espero que me lo aclaren para no caer mas en ese problema.
El código que tiene asociado el botón nuevo registro es el siguiente:
Option Explicit
Dim oDatos As Object
Dim txtMatricula As Object
Dim txtModelo As Object
Dim txtCV1 As Object
Sub CrearRegistro_TablaCV()
Dim oDBC as object
Dim oDlg As Object
Dim Datos()
Dim co1 As Integer
Dim sTmp As String
Dim sSQL As String
Dim sModelo As String
Dim sMatricula As String
'El servicio de bases de datos
oDBC = createUnoService("com.sun.star.sdb.DatabaseContext")
'Cargamos los controles en memoria
Call CargarControles( oDlg )
'Obtenemos el valor del cuadro de texto y le quitamos los espacios sobrantes
sModelo = Trim(txtModelo.getText())
'convertir en mayusculas
txtModelo.setText( sModelo )
If sModelo = "LOCOMOTORA" Then
'Obtenemos los datos de todos los cuadros de texto
Datos = Array( txtMatricula.getText, txtCV1.getText, )
'Agregamos las comillas simples
For co1 = LBound(Datos) To UBound(Datos)
Datos(co1) = "'" & Datos(co1) & "'"
Next co1
'Juntamos y separamos por coma
sTmp = Join( Datos(), ",")
'Construimos la instrucción SQL de inserción
sSQL = "INSERT INTO ""CV"" (""Matricula"",""CV1"") VALUES (" & sTmp & ")"
'Insertamos los datos
Call ActualizarRegistro( sSQL )
End If
End Sub
Sub CargarControles( Dialogo As Object)
Dim txtMatricula As Object
Dim txtModelo As Object
Dim txtCV1 As Object
With Dialogo
txtModelo = .getControl("txtModelo")
txtMatricula = .getControl("txtMatricula")
txtCV1 = .getControl("txtCV1")
End With
End Sub
Sub ActualizarRegistro( Evento )
Dim oCtrl As Object
oCrtl=com.sun.star.sdbc.xresultset.next ()
Form = Evento.Source.Model.Parent
oCtrl = Form.Parent.Parent.GetByName("Modelo")
MsgBox oControl
If Not Evento.Source.getModel.Parent.IsNew Then
Evento.Source.getModel.Parent.updateRow()
End If
End Sub
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Hola,
No has adjuntado el ejemplo, recuerda que debe ser .zip o .rar y no debe sobrepasar los 120 Kb. Si sobre pasa esa cantidad, puedes adjuntarlo a través de un enlace a un servidor externo, tipo Dropbox, Google Drive etc.
Saludos
No has adjuntado el ejemplo, recuerda que debe ser .zip o .rar y no debe sobrepasar los 120 Kb. Si sobre pasa esa cantidad, puedes adjuntarlo a través de un enlace a un servidor externo, tipo Dropbox, Google Drive etc.
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)
Re: Introducir registros nuevos
Buenas
Perdonar se me paso el adjuntar el archivo. Aqui lo teneis
Perdonar se me paso el adjuntar el archivo. Aqui lo teneis
- Adjuntos
-
- Prueba1.rar
- (12.2 KiB) Descargado 185 veces
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Hola,
Revisa si es esto lo que pretendes hacer. Mi macro esta en el modulo 3 y el botón no tiene ninguna acción.
Saludos
Revisa si es esto lo que pretendes hacer. Mi macro esta en el modulo 3 y el botón no tiene ninguna acción.
Saludos
- Adjuntos
-
- Prueba2.zip
- (12.88 KiB) Descargado 185 veces
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)
Re: Introducir registros nuevos
Buenas
He probado la macro y es lo que busco, pero claro al intentar adaptarla a la base real me da un error:
"Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.sdbc.SQLException
Message: Value too long in statement [INSERT INTO "MODELO" ( "Administracion","Cantidad","CarcasaYBastidor","Categoria","ConectorDigital","Decodificador","DireccionDigital","Enganche","Epoca","Escala","EsquemaPintura","Fabricante","FechaCompra","Foto","IluminacionFrontal","IluminacionInterior","IluminacionTrasera","Longitud","NombreModelo","Precio","Referencia","SerieLimitada","Sonido","Velocidad") VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)]."
Creo que es debido a la cantidad de campos que debe inserta la sentencia SQL, es asi??
Un saludo
He probado la macro y es lo que busco, pero claro al intentar adaptarla a la base real me da un error:
"Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.sdbc.SQLException
Message: Value too long in statement [INSERT INTO "MODELO" ( "Administracion","Cantidad","CarcasaYBastidor","Categoria","ConectorDigital","Decodificador","DireccionDigital","Enganche","Epoca","Escala","EsquemaPintura","Fabricante","FechaCompra","Foto","IluminacionFrontal","IluminacionInterior","IluminacionTrasera","Longitud","NombreModelo","Precio","Referencia","SerieLimitada","Sonido","Velocidad") VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)]."
Creo que es debido a la cantidad de campos que debe inserta la sentencia SQL, es asi??
Un saludo
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Hola,
Por la cantidad de campos no parece ser el error, más bien parece que estas intentando cargar un valor en un campo cuyo tamaño no acepta ese valor. Revisa la cantidad de caracteres de los campos y la cantidad de caracteres de los valores a introducir.
Saludos
Por la cantidad de campos no parece ser el error, más bien parece que estas intentando cargar un valor en un campo cuyo tamaño no acepta ese valor. Revisa la cantidad de caracteres de los campos y la cantidad de caracteres de los valores a introducir.
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)
Re: Introducir registros nuevos
Buenas
Al final he realizado varias pruebas, y creo que el problema era un campo del registro que tenia como Imagen. Lo he eliminado y ya no se produce ese error. intentare ver si hay alguna forma de hacer esto para que guarde la imagen también, planteando la macro de otra forma, y modificándolo alguna línea. No se si pueden darme algún consejo de como enfocarlo, lo agradecería.
Un saludo
Al final he realizado varias pruebas, y creo que el problema era un campo del registro que tenia como Imagen. Lo he eliminado y ya no se produce ese error. intentare ver si hay alguna forma de hacer esto para que guarde la imagen también, planteando la macro de otra forma, y modificándolo alguna línea. No se si pueden darme algún consejo de como enfocarlo, lo agradecería.
Un saludo
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Hola,
No es buena practica almacenar imágenes en una BD, lo mejor es tenerlas en una carpeta en el PC, y en cada cambio de registro que las muestre en el formulario. En el foro tienes varios ejemplos para verlo y si te parece adecuado implementarlo a tu BD.
Saludos
No es buena practica almacenar imágenes en una BD, lo mejor es tenerlas en una carpeta en el PC, y en cada cambio de registro que las muestre en el formulario. En el foro tienes varios ejemplos para verlo y si te parece adecuado implementarlo a tu BD.
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)
Re: Introducir registros nuevos
Hola
Muchas gracias a RMG por su ayuda a lo largo de este post. Al final he sacado las fotos de la BD y no me da el error de antes, y también he mirado la forma en que lo tratan en otras BD para aplicarlo mas adelante.
Pero siguiendo con la línea principal de estos post, he probado la ,macro para introducir registros, y después de descubrir varios errores en el diseño del formulario, vuelvo a tener un atasco, aunque esta vez creo tener claro la causa.
El problema lo tengo en esta linea:
"sCategoria = oForm.getByName("Categoria").Text"
Donde Categoria es un campo de lista de datos, y al llegar a esa línea de código se produce el siguiente error:
"Error de ejecución de BASIC.
No se encontró la propiedad o el método: Text."
Los datos que va a contener ese registro son siempre alguno de esa lista, por lo que opte por esa opción. Mi pregunta es si existe un método o propiedad (no llego a distinguir del todo la diferencia), para este tipo de registro que se obtiene por medio de una lista de datos.
Sin mas ……...por ahora , gracias y un saludo
Muchas gracias a RMG por su ayuda a lo largo de este post. Al final he sacado las fotos de la BD y no me da el error de antes, y también he mirado la forma en que lo tratan en otras BD para aplicarlo mas adelante.
Pero siguiendo con la línea principal de estos post, he probado la ,macro para introducir registros, y después de descubrir varios errores en el diseño del formulario, vuelvo a tener un atasco, aunque esta vez creo tener claro la causa.
El problema lo tengo en esta linea:
"sCategoria = oForm.getByName("Categoria").Text"
Donde Categoria es un campo de lista de datos, y al llegar a esa línea de código se produce el siguiente error:
"Error de ejecución de BASIC.
No se encontró la propiedad o el método: Text."
Los datos que va a contener ese registro son siempre alguno de esa lista, por lo que opte por esa opción. Mi pregunta es si existe un método o propiedad (no llego a distinguir del todo la diferencia), para este tipo de registro que se obtiene por medio de una lista de datos.
Sin mas ……...por ahora , gracias y un saludo
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Buenas!
Esto sería para otro hilo nuevo, pero ya que estamos....
El ListBox es un control similar al combobox en apariencia, pero tiene alguna particularidad. Para lo que nos atañe en este momento, el combobox guardaría texto (con lo que te serviría el código utilizado perfectamente) y el listBox guarda o trabaja con índices de item, es decir, aunque muestra un texto, en realidad está trabajando con el item 1, el item 5 o el item 25.
Al final, que es lo que te interesa, se tiene que trabajar en el 'modo vista' para este tipo de control:
A partir de aquí, con la variable CategoríaF ya tienes el texto que fue seleccionado en el control de listBox.
Espero que te funcione!
Un saludo!
Esto sería para otro hilo nuevo, pero ya que estamos....
El ListBox es un control similar al combobox en apariencia, pero tiene alguna particularidad. Para lo que nos atañe en este momento, el combobox guardaría texto (con lo que te serviría el código utilizado perfectamente) y el listBox guarda o trabaja con índices de item, es decir, aunque muestra un texto, en realidad está trabajando con el item 1, el item 5 o el item 25.
Al final, que es lo que te interesa, se tiene que trabajar en el 'modo vista' para este tipo de control:
Código: Seleccionar todo
oCtlV=oForm.GetByName("Categoria") ' Control Categoría
oCtlVista = ThisComponent.getCurrentController.getControl( oCtlV ) ' Vista del control
CategoriaF=oCtlVista.SelectedItem ' Categoría seleccionada
Espero que te funcione!
Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10
Re: Introducir registros nuevos
Hola,
Prueba también en vez de .Text con .CurrentValue
Saludos
Prueba también en vez de .Text con .CurrentValue
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)
Re: Introducir registros nuevos
Hola
Otra vez aqui. Empezando por los últimos post, he probado las dos opciones y ambas sirven, gracias por la ayuda.
Os mando la BD que tengo con el formulario para que podáis verla. Al pulsar el botón nuevo registro, me da error en la linea:
oStat.ExecuteUpdate(sSQL)
y el error que da es:
Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.sdbc.SQLException
Message: Attempt to insert null into a non-nullable column: column: CV2 table: T_CV.
Creo si no me equivoco que en la parte donde construimos la sentencia SQL debería agregar todos los campos de la tabla T_CV. El problema es que esa tabla, al final tiene que llevar 258 registros, no os asustéis , todos salvo 2 son de entero pequeño. Por tanto si la sentencia de SQL debe llevar todos........ buff.
Estoy buscando en programacion SQL algo que lo permita, pero no doy aun con la tecla. En fin espero una vez mas vuestra ayuda.
Un saludo
Otra vez aqui. Empezando por los últimos post, he probado las dos opciones y ambas sirven, gracias por la ayuda.
Os mando la BD que tengo con el formulario para que podáis verla. Al pulsar el botón nuevo registro, me da error en la linea:
oStat.ExecuteUpdate(sSQL)
y el error que da es:
Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.sdbc.SQLException
Message: Attempt to insert null into a non-nullable column: column: CV2 table: T_CV.
Creo si no me equivoco que en la parte donde construimos la sentencia SQL debería agregar todos los campos de la tabla T_CV. El problema es que esa tabla, al final tiene que llevar 258 registros, no os asustéis , todos salvo 2 son de entero pequeño. Por tanto si la sentencia de SQL debe llevar todos........ buff.
Estoy buscando en programacion SQL algo que lo permita, pero no doy aun con la tecla. En fin espero una vez mas vuestra ayuda.
Un saludo
- Adjuntos
-
- MATERIAL FERROVIARIO-2.rar
- (21.7 KiB) Descargado 190 veces
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
El mensaje es bastante claro, NO es necesario que lleve todos, tan solo que estén establecidos como NO-nulo, que es lo que te esta diciendo el mensaje. 258 registros, es bueno para revisarse, tal vez requiera aplicar un poco de refactorización.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Re: Introducir registros nuevos
Hola,
Tienes 2 errores.
1. En esta linea, el valor devuelto del control es texto e intentas insertarlo como número. Fijate en las comillas simples de sDecodificador.
sSQL = "INSERT INTO ""T_CV"" (""Matricula"",""CV1"",""Decodificador"") VALUES ('" & sMatricula & "',"& iCV1 & ","'& sDecodificador &"')"
2. El campo CV2, en diseño lo tienes como entrada requerida "Si", y no estas introduciendo ningún valor.
Saludos
Tienes 2 errores.
1. En esta linea, el valor devuelto del control es texto e intentas insertarlo como número. Fijate en las comillas simples de sDecodificador.
sSQL = "INSERT INTO ""T_CV"" (""Matricula"",""CV1"",""Decodificador"") VALUES ('" & sMatricula & "',"& iCV1 & ","'& sDecodificador &"')"
2. El campo CV2, en diseño lo tienes como entrada requerida "Si", y no estas introduciendo ningún valor.
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)
Re: Introducir registros nuevos
Buenas
De nuevo por aquí con un nuevo atasco. Ando perfeccionando la macro para de este hilo, y tras redefinirla para adaptarla a lo que quiero, no realiza exactamente la ejecución que quiero. La macro esta de la siguiente forma.
Sub CrearRegistro_TablaCV(Evento)
Dim sSQL As String
Dim oStat As Object
Dim oCtlV As Object
Dim oCtlVista As Object
Dim sCategoria As String
Dim sMatricula As String
Dim sDecodificador As String
Dim iCV1 As Integer
Dim oForm As Object
oForm = Evento.Source.Model.Parent
If oForm.IsModified Then
If oForm.IsNew Then oForm.InsertRow() Else oForm.UpdateRow()
End If
sMatricula = oForm.getByName("Matricula").Text
iCV1 = oForm.getByName("CV1").Text
oCtlV=oForm.GetByName("Decodificador") ' Control Categoría
oCtlVista = ThisComponent.getCurrentController.getControl( oCtlV ) ' Vista del control
sDecodificador=oCtlVista.SelectedItem ' Categoría seleccionada
sCategoria = oForm.getByName("Categoria").CurrentValue
If sCategoria = "0" OR "1" OR "2" OR "3" OR "4" Then
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
'Construimos la instrucción SQL de inserción
sSQL = "INSERT INTO ""T_CV"" (""Matricula"",""CV1"",""Decodificador"") VALUES ('" & sMatricula & "',"& iCV1 & ",'"& sDecodificador &"')"
oStat.ExecuteUpdate(sSQL)
End If
If Not oForm.IsNew Then
oForm.moveToInsertRow()
End If
End Sub
El problema se encuentra en las líneas marcadas en rojo. Sea cual sea el valor que toma la variable sCategoria, se ejecuta el cuerpo de If, y solo se debería ejecutar cuando toma alguno de los valores marcado 0 o 1 o 2 o 3 o 4.
No se bien que puede fallar, por lo que agradecería vuestra ayuda
Gracias y un saludo
De nuevo por aquí con un nuevo atasco. Ando perfeccionando la macro para de este hilo, y tras redefinirla para adaptarla a lo que quiero, no realiza exactamente la ejecución que quiero. La macro esta de la siguiente forma.
Sub CrearRegistro_TablaCV(Evento)
Dim sSQL As String
Dim oStat As Object
Dim oCtlV As Object
Dim oCtlVista As Object
Dim sCategoria As String
Dim sMatricula As String
Dim sDecodificador As String
Dim iCV1 As Integer
Dim oForm As Object
oForm = Evento.Source.Model.Parent
If oForm.IsModified Then
If oForm.IsNew Then oForm.InsertRow() Else oForm.UpdateRow()
End If
sMatricula = oForm.getByName("Matricula").Text
iCV1 = oForm.getByName("CV1").Text
oCtlV=oForm.GetByName("Decodificador") ' Control Categoría
oCtlVista = ThisComponent.getCurrentController.getControl( oCtlV ) ' Vista del control
sDecodificador=oCtlVista.SelectedItem ' Categoría seleccionada
sCategoria = oForm.getByName("Categoria").CurrentValue
If sCategoria = "0" OR "1" OR "2" OR "3" OR "4" Then
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
'Construimos la instrucción SQL de inserción
sSQL = "INSERT INTO ""T_CV"" (""Matricula"",""CV1"",""Decodificador"") VALUES ('" & sMatricula & "',"& iCV1 & ",'"& sDecodificador &"')"
oStat.ExecuteUpdate(sSQL)
End If
If Not oForm.IsNew Then
oForm.moveToInsertRow()
End If
End Sub
El problema se encuentra en las líneas marcadas en rojo. Sea cual sea el valor que toma la variable sCategoria, se ejecuta el cuerpo de If, y solo se debería ejecutar cuando toma alguno de los valores marcado 0 o 1 o 2 o 3 o 4.
No se bien que puede fallar, por lo que agradecería vuestra ayuda
Gracias y un saludo
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
- PepeOooSevilla
- Mensajes: 1480
- Registrado: Sab Abr 04, 2009 6:10 pm
- Ubicación: Sevilla (España)
Re: Introducir registros nuevos
Hola.
Prueba sustituyendo la línea
por alguna de estas dos (hacen lo mismo)
Saludos cordiales.
Prueba sustituyendo la línea
Código: Seleccionar todo
If sCategoria = "0" OR "1" OR "2" OR "3" OR "4" Then
Código: Seleccionar todo
If InStr("01234", sCategoria) > 0 Then
Código: Seleccionar todo
If (sCategoria = "0") OR (sCategoria = "1") OR (sCategoria = "2") OR (sCategoria = "3") OR (sCategoria = "4") Then
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Re: Introducir registros nuevos
Buenas
Pues al final funciona con la línea "If (sCategoria = "0") OR (sCategoria = "1") OR (sCategoria = "2") OR (sCategoria = "3") OR (sCategoria = "4") Then" , imagino que es un error de sintaxis, que había cometido. Ahora si hace perfectamente lo que debe realizar.
Voy a seguir afinando un par de cosas mas en esta macro para dar el hilo como resuelto.
Gracias por la ayuda, un saludo
Pues al final funciona con la línea "If (sCategoria = "0") OR (sCategoria = "1") OR (sCategoria = "2") OR (sCategoria = "3") OR (sCategoria = "4") Then" , imagino que es un error de sintaxis, que había cometido. Ahora si hace perfectamente lo que debe realizar.
Voy a seguir afinando un par de cosas mas en esta macro para dar el hilo como resuelto.
Gracias por la ayuda, un saludo
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Hola
Con vuestros consejos y retocando unas líneas he conseguido ya lo que mas o menos quería hacer. Aun me quedan un par de cosas mas por ajustar, y una de ellas es que al cargar el nuevo registro, me borre la imagen del anterior. Como me aconsejasteis las fotos no se encuentran guardadas en la base de datos, sino en una carpeta dentro de la base.
La macro que actúa cuando pulso el botón de nuevo registro es esta:
Solo falta que al pulsar dicho botón tambien "limpie" la foto del formulario del anterior registro introducido.
He visto varios ejemplos por aqui y probado a introducir en la ultima línea, antes del End Sub, la siguiente línea de codigo:
oForm.getByName("ImagenModelo").ImageURL = ""
Pero no consigo que funcione, no se si me falta algo o el control no esta bien puesto. Como siempre agradecería vuestra ayuda.
Un saludo y Gracias.
Con vuestros consejos y retocando unas líneas he conseguido ya lo que mas o menos quería hacer. Aun me quedan un par de cosas mas por ajustar, y una de ellas es que al cargar el nuevo registro, me borre la imagen del anterior. Como me aconsejasteis las fotos no se encuentran guardadas en la base de datos, sino en una carpeta dentro de la base.
La macro que actúa cuando pulso el botón de nuevo registro es esta:
Código: Seleccionar todo
Sub BotonNuevoRegistro (Evento)
Dim oForm As Object
Dim oStat AS Object
Dim oCtlV As Object
Dim oCtlVista As Object
Dim sSQL As String
Dim sMatricula As String
Dim sDecodificador As String
Dim iCV1 As Integer
oForm = Evento.Source.Model.Parent
If oForm.IsModified Then
If oForm.IsNew Then
oForm.InsertRow()
Else
oForm.UpdateRow()
End If
sMatricula = oForm.getByName("Matricula").Text
iCV1 = oForm.getByName("CV1").Text
oCtlV = oForm.getByName("Decodificador")
oCtlVista = ThisComponent.getCurrentController.getControl( oCtlV )
sDecodificador = oCtlVista.SelectedItem
If (sDecodificador <> "No digitalizado") Then
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "INSERT INTO ""T_CV"" (""Matricula"",""CV1"",""Decodificador"") VALUES ('" & sMatricula & "',"& iCV1 & ",'"& sDecodificador &"')"
oStat.ExecuteUpdate(sSQL)
End If
End If
If Not oForm.IsNew Then
oForm.moveToInsertRow()
End If
End Sub
He visto varios ejemplos por aqui y probado a introducir en la ultima línea, antes del End Sub, la siguiente línea de codigo:
oForm.getByName("ImagenModelo").ImageURL = ""
Pero no consigo que funcione, no se si me falta algo o el control no esta bien puesto. Como siempre agradecería vuestra ayuda.
Un saludo y Gracias.
Windows 10, Libre Office Versi??n: 6.2.8.2 (x64)
Re: Introducir registros nuevos
Hola,
La macro para para cargar la imagen la puedes poner tras el cambio de registro del formulario, quizás tengas que hacer otro uso de otra llamada a la URL.
Saludos
La macro para para cargar la imagen la puedes poner tras el cambio de registro del formulario, quizás tengas que hacer otro uso de otra llamada a la URL.
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)