** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - comillas en string
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradocomillas en string

 Responder Responder
Autor
Mensaje
cpampasPT Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 20/Marzo/2010
Localización: Portugal
Estado: Sin conexión
Puntos: 537
Enlace directo a este mensaje Tema: comillas en string
    Enviado: 22/Diciembre/2015 a las 01:12
hola,

El tema de las comillas en una string  me resultan muy dificil de compreender. ahora intento que una string me devuelva este resultado :

$cmd_line_part_4_1=" -body ".'"'.$email_body1.'"'." -ps ".'"'.$log_file_path.
'"'

pienso que la regla seria que en cada palabra entre comillas, duplicar las mismas, como en :

="aqui hay una  ""palabra"""

alguien me da una idea de como conseguirlo, ya que con la regla de las dobles comillas no consigo de ninguna forma.
gracias



Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5289
Enlace directo a este mensaje Enviado: 22/Diciembre/2015 a las 01:54
Tal vez leyendo a los que saben te enteres, por ejemplo a Emilio Sancha:
 
 
Saludos
Arriba
jmmiralles Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 29/Noviembre/2008
Localización: Albacete-España
Estado: Sin conexión
Puntos: 569
Enlace directo a este mensaje Enviado: 23/Diciembre/2015 a las 08:38
Hola a todos,

siguiendo con la teoría también puedes ver:

https://msdn.microsoft.com/es-es/library/office/Ff822547.aspx

o este hilo de este foro

http://www.mvp-access.com/foro/teclear-dos-comillas-igual-a-nada_topic80970.html?KW

un par de ejemplos:

MsgBox "Bom dia cpampas, isto é uma proba de "" Dobles comillas """, vbInformation, "aviso.."


MsgBox "Buenos días cpampas, esto es una prueba """" Dobles comillas """"", vbInformation, "aviso.."




Boa sorte

Saludos desde un lugar de la Mancha

Visita Mi Web

http://jmmirallesortega.wix.com/accessyvba<
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5289
Enlace directo a este mensaje Enviado: 23/Diciembre/2015 a las 15:27
Ahora que son épocas de reflexionar, Patxi Sanz escribió esto sobre las comillas:
 
Lo primero, el porqué del mensaje:
A partir de una duda que se presentó en este foro: http://www.mvp-access.com/foro/forum_posts.asp?TID=43901, CarCar me indicó que copiara la respuesta a ese mensaje y la posteara aquí. Así que ya sabéis: las quejas por el mensaje a CarCar, que es el que tiene la culpa de esto
 
Para asemejar este mensaje, aportación, artículo, "petición" de CarCar, o como lo deseis llamar, al mensaje original en el foro, vamos a suponer que tenemos la siguiente tabla:
 
Nombre de la tabla: tblPersonas
Campos de la tabla:
  1. idPersona -> Clave y autonumérico
  2. nombrePersona -> Texto
  3. apellidosPersona -> Texto
Ahora, la cuestión del mensaje: ¿cuándo debo usar comillas dobles y cuándo comillas simples? La respuesta es muy sencilla, por lo menos al principio, luego ya lo complicaremos: Siempre que usemos un texto o literal de texto, debemos usar comillas dobles para delimitarlo.
 
Así, si en la tabla anterior queremos contar las personas cuyo nombre sea Pepe, podemos usar DCont en un control de un formulario:
 
= DCont("nombrePersona"; "tblPersonas"; "nombrePersona = 'Pepe'")
 
¿Y en qué se traduce esta función y las comillas usadas? Pues en esto:
DCont es el nombre de la función que vamos a usar, y tiene los siguientes argumentos:
  1. Nombre del campo que se va a buscar. Debe ser un texto.
  2. Nombre de la tabla dónde está el campo. Debe ser un texto.
  3. Criterio a usar para determinar qué registros se cuentan. Está definido como Variant, aunque normalmente vamos a establecer un texto como criterio.
Y viendo el ejemplo de la función, vemos que estamos pasando lo siguiente:
  1. "nombrePersona": El nombre del campo que vamos a usar para el contaje. Como es un literal, es decir, estamos indicando directamente el nombre del campo, debemos delimitar el texto. Y esto se consigue con las comillas dobles al principio y al final.
  2. "tblPersonas": El nombre de la tabla donde se encuentra el campo. Este valor actúa igual que el anterior: es un literal de texto o valor constante, y lo delimitamos con comillas dobles para indicar exactamente eso: que es un valor constante y, además, de texto.
  3. "nombrePersona = 'Pepe'" : El criterio que queremos usar: en el campo nombrePersona debe estar el valor Pepe. Al ser un literal de texto, debemos delimitarlo con comillas dobles para que Access lo entienda así, pero además debemos tener en cuenta otra cosa: Pepe es otro literal de texto que se encuentra dentro de otro literal y, por tanto, también debemos delimitarlo.
Bueno, vale: ¿pero por qué has usado comillas simples para delimitar el Pepe, si has dicho que las comillas dobles son las que delimitan el texto?
Porque Access se habría quejado: si usamos comillas dobles para delimitar el texto Pepe:
 
= DCont("nombrePersona"; "tblPersonas"; "nombrePersona = "Pepe"")
 
 
Access empieza a leer de izquierda a derecha, y se encuentra lo siguiente:
 
"nombrePersona = "
 
Que es un literal de texto perfectamente delimitado por 2 comillas dobles, y lo siguiente que lee es:
 
Pepe"")
 
Que no está delimitado correctamente, y ni siquiera le hemos indicado que es una función, por ejemplo, o que lo una a lo anterior mediante el símbolo &, que es el concatenador de textos, con lo que nos arrojará un error:
 
La expresión que introdujo tiene una sintaxis no válida
 
Por eso usamos las comillas simples dentro de las comillas dobles: para poder indicarle a Access que Pepe es un literal de texto, y que además se encuentra dentro de otro literal de texto.
 
Eso está muy bien, pero yo uso controles de un formulario o un informe en los criterios para buscar o contar. ¿Cómo lo hago entonces?
 
Lo que debes hacer entonces es concatenar los diferentes textos en el criterio con &:
 
= DCont("nombrePersona"; "tblPersonas"; "nombrePersona = '" & Forms!MiForm!MiControl & "'")
 
 
Siguiendo la siguiente regla: Al cambiar la referencia al control, función, etc., por el valor que contiene, la sentencia debe quedar igual que si usaras un literal.
 
Sí, claro: con un único criterio lo haces muy bien: ¿pero qué pasa cuando tienes más criterios a usar? ¿eh, majete? ¿cómo hacerlo para no volverte loco con tantas comillas dobles y simples?
 
En ese caso puedes usar una pequeña herramienta que tienes en Access, para verificar que estás haciéndolo bien: la ventana Inmediato del editor de VBA. Si en esta ventana escribimos lo siguiente:
 
Parametro1 = "Pepe"
? "nombrePersona = '"& Parametro1 & "'"
 
Y pulsamos Enter al final de cada línea, nos aparecerá lo siguiente:
 
nombrePersona = 'Pepe'
 
¿Y qué vemos? Lo mismo que va a ver Access al usar esa fórmula, por lo que podemos usarlo como base de nuestro criterio. Por lo que si abrimos el formulario que nos va a servir de base del criterio, y en la ventana Inmediato modificamos la sentencia:
 
? "nombrePersona = '" & Forms!Personas!nombrePersona & "'"
 
Y pulsamos Enter al final, nos encontramos lo siguiente:
 
nombrePersona = 'Pepe'
 
Con lo que podemos hacer pruebas para encontrar el criterio que necesitamos:
 
? "nombrePersona = '" & Forms!Personas!nombrePersona & "' AND apellidosPersona = '" & Forms!Personas!apellidosPersona & "'"
 
Para ver lo siguiente:
 
nombrePersona = 'Pepe' AND apellidosPersona = 'Pérez'
 
¡Vale! Ahora sí que te fastidio: yo tengo un amigo que se llama Brian O'Hara: ¿cómo lo busco? Porque me vuelve a dar error tus consultitas
 
Si usamos el método de delimitar subtextos con comillas simples, es normal que te de error este criterio:
 
"nombrePersona = 'Brian' AND apellidosPersona = 'O'Hara'"
 
Por el mismo motivo que antes nos daba error al delimitar el Pepe con comillas dobles:
 
"nombrePersona = "Pepe""
 
 
Es decir, Access sigue leyendo de izquierda a derecha, por lo que lee esto:
 
"nombrePersona = 'Brian' AND apellidosPersona = 'O'
 
Todo muy correcto. Pero luego lee esto otro:
 
Hara'"
 
Y es cuando se vuelve loco, ya que no lo entiende: ¿qué debemos hacer? Pues indicar que la comilla simple del apellido O'Hara forma parte del texto. ¿Y cómo se hace? Agregando otra comilla simple para tener 2 comillas simples seguidas:
 
"nombrePersona = 'Brian' AND apellidosPersona = 'O''Hara'"
 
Ahora, al encontrarse Access con las 2 comillas simples seguidas, entiende que es una comilla simple y que forma parte del texto, con lo que nos dará el resultado que queremos, sin errores de sintaxis.
 
Pero también tenemos otra posibilidad: como O'Hara es un texto, también lo podemos delimitar con comillas dobles. ¿Cómo? Eso no es posible. Antes has dicho que nos iba a dar errores. Si colocamos una comilla doble para delimitar el subtexto, es normal que nos de error. Pero si usamos la técnica de las 2 comillas simples, y colocamos 2 comillas dobles, el resultado es el mismo: Access entiende que las 2 comillas dobles implican que en realidad debe dejar una para formar el texto. Así, si en la ventana Inmediato escribimos lo siguiente:
 
? "nombrePersona = """ & Forms!Personas!nombrePersona & """ AND apellidosPersona = """ & Forms!Personas!apellidosPersona & """"
 
Y pulsamos Enter, el resultado es el siguiente:
 
nombrePersona = "Brian" AND apellidosPersona = "O'Hara"
 
Un texto completamente válido. Y, por tanto, podemos usar el criterio en nuestras búsquedas.
 
¡Pues vaya! Epera un momentito que busque otro fallo... ¡uhmmm! ¡Ya está! ¡Lo encontré! ¡Je, je! ¿Qué pasa con los nombres de las empresas: Repostería "La alegre caries" me da un error de sintaxis con tus dobles comillas.
 
Porque ahora tienes dobles comillas para delimitar los textos de búsqueda, y Access se encuentra con una doble comilla ("La alegre caries"), donde no tendría que estar. Para evitarlo, hay que buscar esas dobles comillas y convertirlas en 2 dobles comillas:
 
? "nombrePersona = """ & Replace(Forms!Personas!nombrePersona,"""","""""") & """ AND apellidosPersona = """ & replace(Forms!Personas!apellidosPersona,"""","""""") & """"
 
Que nos da como resultado:
 
nombrePersona = "Repostería" AND apellidosPersona = """La alegre caries"""
 
¡Mi madre! Creí que me ibas a reducir los criterios, y me los estás alargando. Ahora sí que me he perdido con tantas " y más '.
 
Pues sí, en esto te tengo que dar la razón: si queremos controlar las comillas, tenemos que escribir "chorizos" muy largos. Pero siempre nos quedan un par de soluciones:
En vez de usar =, usar LIKE y reemplazar las comillas simples y dobles por ?. Es bueno para no tener tantos criterios, pero nos puede dar resultados inesperados: encontrar OSHara en vez de O'Hara, por ejemplo.
 
¡Espera un momentín! He creado una consulta con un criterio del tipo [Introduzca el nombre], ¡y no me da ningún fallo al pasarle el valor con la ventana que muestra Access! ¿Qué pasa? ¿Que Access sabe más que tú? ¡prrrrt!
 
Si hubieras esperado un poquito, te habría explicado esa opción: ¿por qué Access no se queja en este tipo de consultas? Porque ese tipo de consultas son consultas parametrizadas, y en estos casos Access no se queja tanto de los datos que le demos, a no ser que no los pueda convertir. Por ejemplo, "Pepe" no se puede convertir en un número, pero sí que podemos pasar O'Hara o Repostería "La alegre caries" para filtrar un campo de texto. Access no se queja y filtra los datos correctamente.
 
¡Huuyy! Eso me gusta. Explícame más, porfa.
 
Para eso, hay alguien que sabe más que yo, y es Juan M Afán de Ribera, que en esta página lo explica muy bien:
 
 
Y para acabar con el post, que creo que se ha alargado demasiado, os dejo una pequeña base de datos en Access 2000 con ejemplos sobre lo que he tratado aquí:
 
 
P.D.: Espero que este post sirva para aclarar dudas y no para aumentarlas.


Editado por emiliove - 23/Diciembre/2015 a las 15:59
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 23/Diciembre/2015 a las 16:19
Lo que hay que tener claro es que para definir a un . gato no se puede utilizar a un gato y es una regla que se definió así: 'Lo definido NO puede formar parte de la definición'

¿Qué define a una cadena de texto? ==> las dobles comillas
¿Cómo podemos 'definir' a un texto dentro de otro texto? ==> Con la comilla simple
¿Hay alguna otra posibilidad aparte de esas cuando 'esas' se utilizan en el propio texto? ... ==> SI, utilizar la definición de las dobles comillas como un carácter en formato CHR

Access siempre espera encontrar como final de una cadena de texto el mismo marcador que la inicio, así que si deseamos utilizar 'lo que nos cuadre estéticamente', podemos optar por utilizar el marcador que menos aplicación tendría:
Chr(34) & aquí el texto libre & Chr(34)
Arriba
cpampasPT Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 20/Marzo/2010
Localización: Portugal
Estado: Sin conexión
Puntos: 537
Enlace directo a este mensaje Enviado: 26/Diciembre/2015 a las 16:06
Hola a todos,

Les quiero agradecer los consejos y comentarios. Voy a estudiar todo lo que me sugieren. hasta este momento ya consigo generar la mitad de la string que pretendo, y en caso lo consiga les informo del sintaxis final .

Muchas gracias 
Arriba
byronlcl Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2007
Localización: Guatemala
Estado: Sin conexión
Puntos: 2131
Enlace directo a este mensaje Enviado: 27/Diciembre/2015 a las 20:24
Hola cpampasPT,
El concepto ya lo tienes, es correcto tal como lo planteas en:
pienso que la regla seria que en cada palabra entre comillas, duplicar las mismas, como en :
="aqui hay una  ""palabra"""

Una cadena inicia con una comilla doble y termina con una comilla doble. ="Una cadena de texto"
Si quieres que dentro del texto aparezca una comilla doble, debes duplicar la comilla, solo dentro del texto
="Una cadena de "" texto"  esto será igual a: Una cadena de " texto

Como ya tienes el concepto, y reportas que no te funciona, el problema es que no estas poniendo la cantidad correcta de comillas dobles, cuéntalas de nuevo y revísalas.  Recuerda, dentro de la cadena de texto, por CADA comilla doble que quiereas que se mustre, debes colocar dos comillas dobles

Saludos, Byron
No hay que tomarse la vida tan en serio.

Aprende código VBA en unas horas, ejemplos y articulos en:
http://www.byronlcl-access.ucoz.com
Arriba
cpampasPT Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 20/Marzo/2010
Localización: Portugal
Estado: Sin conexión
Puntos: 537
Enlace directo a este mensaje Enviado: 21/Enero/2016 a las 11:55
Hola,
os confieso que al final tuve que resolver el tema de otra forma, lo intente conforme me sugeristeis, pero la string me parece demasiado compleja.

la string que se pretendia generar es un comando para enviar email atraves de una aplicacion externa, y opte por enviar el email de forma bastante mas sencilla con una funcion en VBA (libreria CDO)

Gracias por Vuestra ayuda que me sirve para otras situaciones que tengo similares

Podeis cerrar el hilo
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Binghamton Jail
Estado: Sin conexión
Puntos: 3595
Enlace directo a este mensaje Enviado: 21/Enero/2016 a las 15:42
Yo hago la siguiente prueba 

Sub kk()
Dim x As String
x = "hola ""manolo"" " ' (comillas) hola(espacio)(comillas)(comillas)manolo(comillas)(comillas)(espacio)(comillas)
End Sub

Luego en la ventana de debug 
? x
hola "manolo" 

Que creo que es lo que buscabas...

Un saludo.

Luis
Hay un culto a la ignorancia y siempre lo ha habido y es alimentado por la falsa noción de que democracia significa que "mi ignorancia es tan buena como su conocimiento". (Isaac Asimov)
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable