[RESUELTO] Contar y concatenar campos según su número
[RESUELTO] Contar y concatenar campos según su número
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.
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
Re: Contar y concatenar campos según su número
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!
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
Libreoffice 6.4.2, en Windows 10
Re: Contar y concatenar campos según su número
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.
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
Re: Contar y concatenar campos según su número
Hola,
Otra posible solución.
Saludos y feliz año.
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
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: Contar y concatenar campos según su número
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.
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
Re: Contar y concatenar campos según su número
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.
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
Re: Contar y concatenar campos según su número
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.
SiRMGcualquiera 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).
A ver si hay suerte!
Felices Reyes!
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
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. |
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
Libreoffice 6.4.2, en Windows 10
Re: Contar y concatenar campos según su número
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!
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
Re: [RESUELTO] Contar y concatenar campos según su número
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.
Saludos
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
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: [RESUELTO] Contar y concatenar campos según su número
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.
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