La
página Web de Emilio Sancha
|
|
Inicio | Access | Excel | Visual Script | Enlaces | Búsquedas | Apuntes | Libro de Visitas |
Concatenación de cadenas y construcción de sentencias SQL |
Para concatenar dos cadenas utilizaremos el carácter & (ampersand) para unirlas. Son varios los casos que se nos pueden producir cuando construimos una cadena a partir de otras y/o números, cuadros de texto de formularios, celdas de hojas de cálculo, etc.
La mas simple de las posibilidades: concatenar dos cadenas, sin mas |
Dim strCadena1 As String,
_ strCadena2 As String strCadena1 = "Hola" strCadena2 = "Mundo!" Debug.Print strCadena1 & strCadena2 |
Al ejecutar ese código nos devolverá en la ventana inmediato: |
HolaMundo! |
Claro que en este caso, y como por otra parte es lógico, el resultado no es el deseado, para que no se nos peguen las dos cadenas habremos de utilizar algún tipo de separador, como por ejemplo el espacio: |
Dim strCadena1 As String,
_ strCadena2 As String strCadena1 = "Hola" strCadena2 = "Mundo!" Debug.Print strCadena1 & " " & strCadena2 |
Ahora sí, el resultado es correcto |
Hola Mundo! |
Si quisiéramos que alguna de las palabras apareciera entrecomillada, tenemos dos modos de hacerlo, utilizar dos comillas dobles, para “devolver” una |
Dim strCadena1 As String,
_ strCadena2 As String strCadena1 = "José" strCadena2 = "Pepe" Debug.Print strCadena1 & ", alias """ & strCadena2 & """" |
O bien utilizar el carácter ASCII 34, correspondiente a la comilla doble. |
Debug.Print strCadena1 & ", alias " & Chr(34) & strCadena2 & Chr(34) |
|
José, alias "Pepe" |
Ahora vamos a concatenar una cadena con un número |
Dim strCadena As String,
_ intNumero As Integer strCadena = "Año" intNumero = 2011 Debug.Print strCadena & " " & intNumero |
El resultado obtenido sería: |
Año 2011 |
Hasta aquí es todo muy fácil, las “complicaciones” empiezan cuando en lugar de concatenar variables hemos de concatenar campos de un formulario o celdas de Excel.
Por ejemplo, dos cuadros de texto de un formulario |
Debug.Print Form_Formulario1.Texto2 & " " & Form_Formulario1.Texto4 |
El resultado en este caso sería, por ejemplo, teniendo en cuenta que Texto2 y texto4 son 2 cuadros de texto que existen en Formulario1 y que, en este momento contienen respectivamente "Hola" y "Mundo". |
Hola Mundo! |
OJO Form_Formulario1 es una nomenclatura Access que solo entiende si Formulario1 contiene código o su propiedad HasModule está establecida a 1, otra forma de referenciar el control sería Forms!Formulario1!Texto4.
Si se tratara de celdas de Excel la situación sería parecida. |
Debug.Print Worksheets("Hoja1").Range("A1") & " " & Worksheets("Hoja1").Range("B1") |
De cualquier modo sigue siendo muy sencillito, se complica un poco mas cuando hemos de construir, por ejemplo una sentencia SQL uniendo datos numéricos, fechas, variables, cuadros de texto, comillas dobles o simples, … Siempre que trabajemos con datos de texto estos deberán ir incluidos entre comillas simples.
Por ejemplo: |
Dim strSQL As String, _ strPalabra As String strPalabra = "Prueba" strSQL = "INSERT INTO tblPruebas (Palabra)" strSQL = strSQL & "SELECT '" & strPalabra & "'" Debug.Print strSQL |
Esto devuelve |
INSERT INTO tblPruebas (Palabra)SELECT 'Prueba', |
Como se puede ver tenemos un problema: (Palabra)SELECT, puesto que falta un espacio entre el paréntesis y SELECT que habrá que añadir, es algo de lo que siempre deberemos estar muy pendientes especialmente cuando realicemos la concatenación en varias líneas. Vamos a arreglarlo y además a tomar el dato de un campo de un formulario: |
Dim strSQL As String strSQL = "INSERT INTO tblPruebas (Palabra) " strSQL = strSQL & "SELECT '" & Forms!frmClientes!IdCliente & "'" Debug.Print strSQL |
Con ello obtendremos: |
INSERT INTO tblPruebas (Palabra) SELECT 'ALFKI' |
Vamos a añadir ahora un número entero. |
Dim strSQL As String, _ strPalabra As String, _ intNumero As Integer strPalabra = "Prueba" intNumero = 123 strSQL = "INSERT INTO tblPruebas (Palabra, Numero) " strSQL = strSQL & "SELECT '" & strPalabra & "', " strSQL = strSQL & intNumero Debug.Print strSQL |
El resultado: |
INSERT INTO tblPruebas (Palabra, Numero) SELECT 'Prueba', 123 |
Si el número tuviera decimales: |
Dim strSQL As String, _ strPalabra As String, _ sngNumero As Single strPalabra = "Prueba" sngNumero = 123.45 strSQL = "INSERT INTO tblPruebas (Palabra, Numero) " strSQL = strSQL & "SELECT '" & strPalabra & "', " strSQL = strSQL & sngNumero Debug.Print strSQL |
Eso devolvería: |
INSERT INTO tblPruebas (Palabra, Numero) SELECT 'Prueba', 123,45 |
En este caso la concatenación sería correcta, sin embargo al intentar ejecutar esa sentencia SQL se produciría un error, puesto que estamos pasando tres valores a dos campos, ¿por qué?, porque VBA ha convertido el punto decimal en una coma, cosas de VBA y la configuración regional, la solución para evitarlo es decirle que el número lo quieres convertir en cadena, para ello usamos la función Str
Quedaría así: |
Dim strSQL As String, _ strPalabra As String, _ sngNumero As Single strPalabra = "Prueba" sngNumero = 123.45 strSQL = "INSERT INTO tblPruebas (Palabra, Numero) " strSQL = strSQL & "SELECT '" & strPalabra & "', " strSQL = strSQL & Str(sngNumero) Debug.Print strSQL |
Y el resultado: |
INSERT INTO tblPruebas (Palabra, Numero) SELECT 'Prueba', 123.45 |
La diferencia con la cadena anterior, donde antes ponía 123,45 ahora pone 123.45 en este caso VBA y SQL se entenderán perfectamente. |
Vamos a ver mas “problemas” con los que nos podemos encontrar, supongamos que la palabra a incluir contiene una comilla simple, como habéis visto las cadenas las insertamos entre comillas simples, por ejemplo: |
Dim strSQL As String, _ strPalabra As String strPalabra = "McDonald's" strSQL = "INSERT INTO tblPruebas (Palabra) " strSQL = strSQL & "SELECT '" & strPalabra & "'" Debug.Print strSQL |
El resultado: |
INSERT INTO tblPruebas (Palabra) SELECT 'McDonald's' |
Que aunque pueda parecer correcto, sintácticamente no lo es, esas comillas simples desparejadas no le van a gustar nada a SQL, para resolver el problema habremos de reemplazar esa comilla simple por dos, es una buena costumbre hacerlo sistemáticamente si hay alguna posibilidad de que eso ocurra. |
Dim strSQL As String, _ strPalabra As String strPalabra = "McDonald's" strSQL = "INSERT INTO tblPruebas (Palabra) " strSQL = strSQL & "SELECT '" & Replace(strPalabra, "'", "''") & "'" Debug.Print strSQL |
La cadena devuelta, |
INSERT INTO tblPruebas (Palabra) SELECT 'McDonald''s' |
que aunque pueda parecer incorrecta, a SQL le va a gustar mucho mas que la anterior, dado que el número de comillas simples resultantes es par.
Otra complicación con la que podemos encontrarnos al construir una sentencia SQL cuando trabajemos con fechas, es que hemos de pasarlas entre almohadillas (delimitador que indica a Access que se trata de una fecha) y
siempre en formato mm/dd/yy para lo cual habrá de usarse la función Format. Ni que decir tiene que si se deben tener en cuenta las horas también hay que meterlas en el
Format |
Dim strSQL As String, _ strPalabra As String strPalabra = "McDonald's" strSQL = "INSERT INTO tblPruebas (Palabra, Fecha) " strSQL = strSQL & "SELECT '" & Replace(strPalabra, "'", "''") & "', " strSQL = strSQL & "#" & Format(Now, "mm/dd/yy hh:nn:ss") & "#" Debug.Print strSQL |
Que devolverá algo así: |
INSERT INTO tblPruebas (Palabra, Fecha) SELECT 'McDonald''s', #03/30/11 23:11:33# |
Emilio Sancha 30/03/11 |
NOTA: La información contenida en esta página, así como el código fuente incluido en la misma, se proporciona TAL CUAL, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en la presenta página. This page is provided AS IS with no warranties, and confers no rights. You assume all risk for your use.
|
|||
Ultima actualización: Sábado, 15 de Octubre de 2016
|
© Emilio Sancha 2.004-2.016 |