[RESUELTO] Contar y concatenar campos según su número

Discute sobre las herramientas de la base de datos
Responder
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

[RESUELTO] Contar y concatenar campos según su número

Mensaje por jopicach »

Hola,

Estoy intentando lograr lo siguiente que hacía en Access, pero no lo consigo en LibreOffice. He buscado y he encontrado cosas sobre concatenar en consultas, pero no he encontrado nada tan específico como lo que busco.

Tengo varios campos en un formulario (en el ejemplo que adjunto he puesto cuatro con el valor de una tabla, "Nombre1", "Nombre2", "Nombre3" y "Nombre4" y otro "TextoCompleto" donde irá el resultado. De lo que se trata es que en al marcar cada una de las casillas, en el campo "TextoCompleto" ponga el texto seleccionado, pero con la salvedad de que cuenta los textos seleccionados y además, si son dos textos pondrá entre ellos la letra "y" y si son tres o más irá poniendo comas "," entre ellos y la "y" antes del último. por ejemplo

Nombre1 es Juan - (casilla1)
Nombre2 es Carlos - (casilla2)
Nombre3 es Luis - (casilla3)
Nombre4 es Alfredo - (casilla4)

Si selecciono solo una casilla, por ejemplo la 1, en el campo "TextoCompleto" pondría el siguiente texto: Es uno. Juan.
Si selecciono las casillas 1 y 4 en el campo "TextoCompleto" pondría el siguiente texto: Son dos. Juan y Alfredo.
Pero si selecciono mas de dos casillas, 1, 2 y 4 pondría: Son tres. Juan, Carlos y Alfredo.
Si fuesen las cuatro casillas pues: Son cuatro. Juan, Carlos, Luis y Alfredo.

Muchas gracias si alguien me puede ayudar y feliz año a todos.
Adjuntos
PruebaConcatenar.7z
(12.71 KiB) Descargado 141 veces
Última edición por jopicach el Jue Ene 04, 2018 11:59 pm, editado 3 veces en total.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Contar y concatenar campos según su número

Mensaje por Longi »

Buenas!

Te he cambiado un poco los conceptos.
He puesto el resultado final en un subformulario, el cual depende de una consulta (Consulta2, que a su vez viene de Consulta1). Con ello no es necesario el último campo de la tabla( en este caso no se ve el beneficio, ya que las vueltas que doy son amplias, pero no tiene sentido guardar en un campo algo que se puede obtener por combinación de otros campos de la misma tabla o por una consulta.)
En la consulta he hecho suma del número total de selecciones por un lado, y por otro he asignado el valor 'coma'+ nombre si la casilla está marcada.
En la segunda consulta he eliminado el primer elemento de los nombres, con lo que quito la coma del primer nombre que está seleccionado (esto no tiene sentido si el seleccionado es el primer nombre, que no debiéramos haberle añadido la coma, pero si el primero no está seleccionado, tendríamos que el primer nombre que sale, lo tendríamos con una coma delante).
Por otro lado he puesto otra macro para que en cuanto cambie el estado del control booleano, se actualice el formulario principal y el subformulario, con lo cual ya tenemos el resultado final en el subformulario a la vista.
Se puede atacar de otras maneras, incluso con lo que preguntaste en otro hilo sobre rellenar un campo en función de otro (concatenando los que han sido seleccionados), pero no me terminaba de cuadrar con el contaje necesario.
Quizá lo lié un poco demás, pero el resultado creo que viene a ser lo que pedías.

Un saludo navideño!
Adjuntos
PruebaConcatenar.7z
(14.02 KiB) Descargado 131 veces
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

Re: Contar y concatenar campos según su número

Mensaje por jopicach »

Hola de nuevo,

Muchas gracias por tu respuesta. Si es diferente el concepto. El resultado es casi el que buscaba, con la excepción de que no siempre lleva una coma entre los nombres. Solo si son dos o más nombres, delante del último nombre debería llevar una 'y' ejem. Juan y Alfredo o Juan, Carlos, Luis y Alfredo. En tu ejemplo no se como se aplicaría. Por si sirve de algo, la macro con la que lo hacía en Ms era así:

Function FuncionFinal()

Dim asignamosy, Contador As Integer
Dim at0, at2, at4 As String
asignamosy = 0

If Me.Texto1 > "" Then
asignamosy = 1
at0 = " y " & Me.Texto1
Else
at0 = ""
End If

If Me.Texto2 > "" Then
If asignamosy = 0 Then
asignamosy = 1
at2 = " y " & Me.Texto2
Else
at2 = ", " & Me.Texto2
End If
Else
at2 = ""
End If

If Me.Texto3 > "" Then
If asignamosy = 0 Then
asignamosy = 1
at4 = " y " & Me.Texto3
Else
at4 = ", " & Me.Texto3
End If
Else
at4 = ""
End If

Me.Texto10 = at4 & at2 & at0
Contador = Len(Me.Texto10)

If left(Me.Texto10, 3) = " y " Then
Me.Texto10 = Mid(Me.Texto10, 3, Contador - 2)
Else
Me.Texto10 = Mid(Me.Texto10, 2, Contador - 0)
End If

End Function


Seguiré estudiando tu ejemplo a ver si logro algo.

Un saludo.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Contar y concatenar campos según su número

Mensaje por RMG »

Hola,

Otra posible solución.

Código: Seleccionar todo

Sub Concatenar(Evento)'evento Item modificado de lass casillas.
	Dim oForm As Object
	Dim oTxt As Object
	Dim oTxt1 As Object
	Dim oTxt2 As Object
	Dim oTxt3 As Object
	Dim oTxt4 As Object
	Dim oCasilla1 As Object
	Dim oCasilla2 As Object
	Dim oCasilla3 As Object
	Dim oCasilla4 As Object
	Dim iCuenta As Integer
	Dim sTxt As String
	Dim sTxt1 As String
	Dim sTxt2 As String
	Dim sTxt3 As String
	Dim sTxt4 As String
	oForm = Evento.Source.Model.Parent
	oTxt = oForm.getByName("oTxtTextoCompleto")
	oTxt1 = oForm.getByName("oTxtNombre1")
	oTxt2 = oForm.getByName("oTxtNombre2")
	oTxt3 = oForm.getByName("oTxtNombre3")
	oTxt4 = oForm.getByName("oTxtNombre4")
	oCasilla1 = oForm.getByName("chkCasillaNombre1")
	oCasilla2 = oForm.getByName("chkCasillaNombre2")
	oCasilla3 = oForm.getByName("chkCasillaNombre3")
	oCasilla4 = oForm.getByName("chkCasillaNombre4")
	iCuenta = oCasilla1.State +  oCasilla2.State +  oCasilla3.State +  oCasilla4.State
	If iCuenta = 0 Then
		oTxt.BoundField.UpdateString("")
		If oForm.IsNew Then oForm.InsertRow Else oForm.UpdateRow
		Exit Sub
	End If
	If oCasilla1.State = 1 Then sTxt1 = oTxt1.Text Else sTxt1 = ""
	If oCasilla2.State = 1 Then sTxt2 = oTxt2.Text Else sTxt2 = ""
	If oCasilla3.State = 1 Then sTxt3 = oTxt3.Text Else sTxt3 = ""
	If oCasilla4.State = 1 Then sTxt4 = oTxt4.Text Else sTxt4 = ""
	Select Case iCuenta
		Case 1
			If sTxt1 <> "" Then sTxt = 	"Es 1. " & sTxt1
			If sTxt2 <> "" Then sTxt = 	"Es 1. " & sTxt2
			If sTxt3 <> "" Then sTxt = 	"Es 1. " & sTxt3
			If sTxt4 <> "" Then sTxt = 	"Es 1. " & sTxt4
		Case 2
			If sTxt1 <> "" And sTxt2 <> "" Then	sTxt = 	"Son 2. " & sTxt1 & " y " & sTxt2
			If sTxt1 <> "" And sTxt3 <> "" Then sTxt = 	"Son 2. " & sTxt1 & " y " & sTxt3
			If sTxt1 <> "" And sTxt4 <> "" Then sTxt = 	"Son 2. " & sTxt1 & " y " & sTxt4
			If sTxt2 <> "" And sTxt3 <> "" Then sTxt = 	"Son 2. " & sTxt2 & " y " & sTxt3
			If sTxt2 <> "" And sTxt4 <> "" Then sTxt = 	"Son 2. " & sTxt2 & " y " & sTxt4
			If sTxt3 <> "" And sTxt4 <> "" Then sTxt = 	"Son 2. " & sTxt3 & " y " & sTxt4
		Case 3
			If sTxt1 = "" Then	sTxt = 	"Son 3. " & sTxt2 & ", " & sTxt3 & " y " & sTxt4
			If sTxt2 = "" Then	sTxt = 	"Son 3. " & sTxt1 & ", " & sTxt3 & " y " & sTxt4
			If sTxt3 = "" Then	sTxt = 	"Son 3. " & sTxt1 & ", " & sTxt2 & " y " & sTxt4
			If sTxt4 = "" Then	sTxt = 	"Son 3. " & sTxt1 & ", " & sTxt2 & " y " & sTxt3
		Case 4
			sTxt = 	"Son 4. " & sTxt1 & ", " & sTxt2 & ", "& sTxt3 & " y " & sTxt4
	End Select
	oTxt.BoundField.UpdateString(sTxt)
	If oForm.IsNew Then oForm.InsertRow Else oForm.UpdateRow
End Sub
Saludos y feliz año.
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)
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

Re: Contar y concatenar campos según su número

Mensaje por jopicach »

Hola,

Muchas gracias RMG. Esta es justo la solución que quería lograr desde un principio, aunque la que propuso Longi creo que también se hubiese podido adaptar y se lo agradezco a el también. Estoy admirado de la ayuda que encontramos en este foro por parte vuestra los que nos iniciamos en esta aplicación y con ello nos anima a continuar y aprender.

Subo el ejemplo resuelto por si a alguien le puede servir.

Muchas gracias a los dos de nuevo.

Saludos y feliz año.
Adjuntos
PruebaConcatenarFinal.7z
(12.98 KiB) Descargado 140 veces
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

Re: Contar y concatenar campos según su número

Mensaje por jopicach »

Hola de nuevo,

Perdón por preguntar de nuevo. Solo es para hacer una consulta. La solución está muy bien y fácil cuando se tratan de pocos campos como en el ejemplo, pero al querer adaptarla al proyecto me he encontrado con el problema de que los campos a concatenar pueden llegar a ser hasta diez, por lo que las combinaciones que habría que hacer serían muchísimas.

Gracias.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Contar y concatenar campos según su número

Mensaje por Longi »

Buenas!
El resultado creo que es el deseado, pero ya me costó! (me lo tomé como un reto)
Yo no fui capaz de leer el libro de Mauricio, porque al llegar a los array me bloqueaba ( y palabra que lo he intentado!). Bien! aquí intenté manejar arrays, y aunque no puedo explicar cómo, lo cierto es que funciona.
Quedó un código seguramente demasiado largo, como lo suelo hacer yo todo.
Si RMGcualquiera que visite el foro lo repasase, seguramente se podrían eliminar líneas o cambiar cosas que lo hiciesen más lógico, pero ya digo, creo que debe funcionar para hasta 99 nombres diferentes (ampliable a 999, etc).
 Editado: La idea original era que al hacer el ciclo sobre los controles, cada vez que encontrase una casilla, activa, y con el inicio del nombre igual, lo metiese en una matriz, que iría redimensionándose con cada uno de los nombres. No fui capaz de hacerlo, y entonces terminé haciendo lo que hay en el código, pero creo que habría sido mucho más elegante de la otra manera. 
A ver si hay suerte!

Felices Reyes!
Adjuntos
PruebaConcatenar.7z
(14.02 KiB) Descargado 130 veces
Última edición por Longi el Vie Ene 05, 2018 11:56 am, editado 1 vez en total.
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

Re: Contar y concatenar campos según su número

Mensaje por jopicach »

Hola de nuevo y muchas gracias por tu esfuerzo.

Efectivamente, el resultado es el deseado y me parece perfecto. Se pueden ir añadiendo campos y casillas y efectúa la cuenta y concatena el texto correctamente. Lo veo muy complicado para mi ahora mismo, pero se agradecen los comentarios en las líneas del código para poder entender lo que hace cada una de ellas.

Lo dicho en mi mensaje anterior Gracias a Longi y RMG por vuestra ayuda.

Subo el archivo con otros tres campos que le he añadido al ejemplo y doy por resuelto.

Felices Reyes!
Adjuntos
PruebaConcatenar-FIN.7z
(14.63 KiB) Descargado 125 veces
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: [RESUELTO] Contar y concatenar campos según su número

Mensaje por RMG »

Hola,

Puesto que lo tenia casi finalizado y aprovechando la solución final de Longi, os dejo otra posibilidad. La diferencia es que hay cargar los campos en la matriz.

Código: Seleccionar todo

Sub ConcatenarConCasillas(Evento)'evento Item modificado de las casillas.
   Dim oForm As Object
   Dim campos()'matriz campos de texto
   Dim casillas()'matriz casillas
   Dim temp()'matriz tempotal de los campos seleccionados
   Dim i As Integer, j As Integer, E As String, S As String, c As String, y As String, p As String
   Dim cuenta As Integer
   Dim valor As Integer
   Dim oTxt As Object
   Dim sTxt As String
	E = "Es " : S = "Son " : c = ", " : y = " y " : p = ". "
	oForm = Evento.Source.Model.Parent
	oTxt = oForm.getByName("oTxtTextoCompleto")
	campos = Array("oTxtNombre1", "oTxtNombre2", "oTxtNombre3", "oTxtNombre4")
	casillas = Array("chkCasillaNombre1", "chkCasillaNombre2", "chkCasillaNombre3", "chkCasillaNombre4")
	oTxt.BoundField.UpdateString("")
	For i = (LBound(casillas)) To (UBound(casillas))
		valor = oForm.getByName(casillas(i)).State
	If valor = 1 Then
		cuenta = cuenta + 1
		If sTxt = "" Then
			sTxt = oForm.getByName(campos(i)).Text
			oTxt.BoundField.UpdateString(sTxt)
		Else
			sTxt = sTxt & c & oForm.getByName(campos(i)).Text
			oTxt.BoundField.UpdateString(sTxt)
		End If
		Redim Preserve temp(cuenta)
		temp(cuenta) = oForm.getByName(campos(i)).Text
	End if  
	Next
	For i = LBound(temp) To UBound(temp)
    	LongitudUltimo = Len( temp(i))
    Next
	LongitudTotal = Len (oTxt.Text)
	If LongitudUltimo < LongitudTotal Then 'el -2 es para eliminar la coma final
    	oTxt.BoundField.UpdateString( S & cuenta & p & Left (oTxt.Text,LongitudTotal-LongitudUltimo-2)& " y " & Right (oTxt.Text,LongitudUltimo))
    End if
    If LongitudUltimo >= LongitudTotal  Then
    	oTxt.BoundField.UpdateString(E & cuenta & p & oTxt.Text)
    End if
    If LongitudUltimo = 0 Then
    	oTxt.BoundField.UpdateString("")
    End if
    If oForm.IsNew Then oForm.InsertRow Else oForm.UpdateRow
End Sub
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)
jopicach
Mensajes: 143
Registrado: Dom Nov 20, 2016 3:24 pm
Ubicación: Almería (España)

Re: [RESUELTO] Contar y concatenar campos según su número

Mensaje por jopicach »

Hola,

Muchas gracias RMG, y perdón por no haber podido contestar antes. Me parece perfecto y lo adaptare tambien para utilizarlos.

Gracias de nuevo a los dos por vuestro esfuerzo en ayudar.

Un saludo.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Responder