viernes, 12 de septiembre de 2014

Publicar en WordPress desde Microsoft Access via XMLRPC Parte 2

Continuando con nuestra serie de posts acerca de cómo publicar en WordPress desde una aplicación local en Microsoft Access, en esta segunda oportunidad veremos cómo subir una foto a la librería de medios de WordPress.

Si aún no viste la parte 1, te recomiendo que la leas en este enlace.

El código

Sub PublicarMedioEnWordPress()
    ' Datos de Autenticación
    txtURL = SITIO
    txtUserName = USUARIO
    txtPassword = PASSWORD
    
    ' Datos del Medio
    txtArchivo = "Desert.jpg"
    txtTipo = "image/jpeg"
    Dim txtImagen As String
    txtImagen = "C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"
      
    ' ServerXMLHTTP
    Dim objSvrHTTP As ServerXMLHTTP
    Dim strT As String
    Set objSvrHTTP = New ServerXMLHTTP
  
    ' Autenticación
    objSvrHTTP.Open "POST", txtURL, False, CStr(txtUsuario), CStr(txtPassword)
    objSvrHTTP.setRequestHeader "Accept", "application/xml"
    objSvrHTTP.setRequestHeader "Content-Type", "application/xml"

    strT = strT & "<methodCall>"
    
    ' Acción
    strT = strT & "<methodName>metaWeblog.newMediaObject</methodName>"
    
    ' General
    strT = strT & "<params>"
    strT = strT & "<param><value><string>0</string></value></param>"
    strT = strT & "<param><value>" & txtUserName & "</value></param>"
    strT = strT & "<param><value><string>" & txtPassword & "</string></value></param>"
    strT = strT & "<param>"
    
    strT = strT & "<struct>"
    
    ' Nombre, Tipo e Imagen
    strT = strT & "<member><name>name</name><value><![CDATA[" & txtArchivo & "]]></value></member>"
    strT = strT & "<member><name>type</name><value><![CDATA[" & txtTipo & "]]></value></member>"
    strT = strT & "<member><name>bits</name><value><base64>" & EncodeFile(txtImagen) & "</base64></value></member>"
    
    strT = strT & "</struct>"
    strT = strT & "</param>"
    
    strT = strT & "</params>"
    strT = strT & "</methodCall>"

   
    ' Publicación
    objSvrHTTP.send strT

    ' Debug
    Debug.Print objSvrHTTP.responseText
    MsgBox objSvrHTTP.responseText

End Sub

Public Function EncodeFile(strPicPath As String) As String
    Const adTypeBinary = 1          ' Binary file is encoded

    ' Variables for encoding
    Dim objXML
    Dim objDocElem

    ' Variable for reading binary picture
    Dim objStream

    ' Open data stream from picture
    Set objStream = CreateObject("ADODB.Stream")
    objStream.Type = adTypeBinary
    objStream.Open
    objStream.LoadFromFile (strPicPath)

    ' Create XML Document object and root node
    ' that will contain the data
    Set objXML = CreateObject("MSXml2.DOMDocument")
    Set objDocElem = objXML.createElement("Base64Data")
    objDocElem.DataType = "bin.base64"

    ' Set binary value
    objDocElem.nodeTypedValue = objStream.Read()

    ' Get base64 value
    EncodeFile = objDocElem.Text

    ' Clean all
    Set objXML = Nothing
    Set objDocElem = Nothing
    Set objStream = Nothing

End Function


El resultado


El XML retornado por WordPress:


Bibliografía

jueves, 11 de septiembre de 2014

Publicar en WordPress desde Microsoft Access via XMLRCP Parte 1

Algunas veces necesitamos comunicar aplicaciones internas de nuestros clientes con su sitio web o extranet. En esta serie de posts vamos a ver algunos ejemplos de cómo comunicar dos mundos:

Mundo 1:
  • Servidor Windows del cliente
  • Microsoft Access
  • SQL Server
  • Red Interna
Mundo 2: 
  • Hosting BlueHost
  • WordPress
  • Linux
  • MySQL
  • Internet

¿Cómo comunicaremos ambos mundos?

A través del servicio XMLRCP de WordPress. Es posible que el servicio esté bloqueado por nuestro Hosting, más abajo explico cómo proceder. Dentro de MS Access deberemos agregar la siguiente referencia:



El código

Sub PublicarEnWordPress()
    ' Datos de Autenticación
    txtUserName = USUARIO
    txtPassword = PASSWORD
    
    ' Datos del Post
    txtBlogId = "1"
    txtTitulo = "Hola mundo desde Access"
    txtContenido = "Este es un post de ejemplo publicado desde Microsoft Access"
    Dim txtCategorias(1) As String
    txtCategorias(1) = "Uncategorized"
      
    ' ServerXMLHTTP
    Dim objSvrHTTP As ServerXMLHTTP
    Dim strT As String
    Set objSvrHTTP = New ServerXMLHTTP
  
    ' Autenticación
    objSvrHTTP.Open "POST", txtURL, False, CStr(txtUsuario), CStr(txtPassword)
    objSvrHTTP.setRequestHeader "Accept", "application/xml"
    objSvrHTTP.setRequestHeader "Content-Type", "application/xml"

    strT = strT & "<methodCall>"
    
    ' Acción
    strT = strT & "<methodName>metaWeblog.newPost</methodName>"
    
    ' General
    strT = strT & "<params>"
    strT = strT & "<param><value><string>" & txtBlogId & "</string></value></param>"
    strT = strT & "<param><value>" & txtUserName & "</value></param>"
    strT = strT & "<param><value><string>" & txtPassword & "</string></value></param>"
    strT = strT & "<param>"
    
    strT = strT & "<struct>"
    
    ' Categorías
    strT = strT & "<member><name>categories</name><value><array>"
    strT = strT & "<data>"
    
    For i = 1 To UBound(txtCategorias)
        strT = strT & "<value>" & txtCategorias(i) & "</value>"
    Next i
    strT = strT & "</data>"
    strT = strT & "</array></value></member>"
    
    ' Título, contenido y fecha
    strT = strT & "<member><name>description</name><value><![CDATA[" & txtContenido & "]]></value></member>"
    strT = strT & "<member><name>title</name><value>" & txtTitulo & "</value></member>"
    strT = strT & "<member><name>dateCreated</name><value><dateTime.iso8601>" & Format(Now(), "yyyyMMdd") & "T" & Format(Now(), "hh:mm:ss") & "</dateTime.iso8601></value></member>"
    
    strT = strT & "</struct>"
    strT = strT & "</param>"
    
    ' Tipo de publicación: 0 DRAFT, 1 PUBLISH
    strT = strT & "<param><value><boolean>1</boolean></value></param>"
    strT = strT & "</params>"
    
    strT = strT & "</methodCall>"
    
    ' Publicación
    objSvrHTTP.send strT

    ' Debug
    Debug.Print objSvrHTTP.responseText
    MsgBox objSvrHTTP.responseText

End Sub


La publicación

A continuación vemos el post publicado:

Y el resultado devuelto por WordPress


Permisos en el Hosting

Es posible que en estos primeros intentos obtengamos un error como el siguiente:

<head><title>Not Acceptable!</title></head><body><h1>Not Acceptable!</h1><p>An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security.</p></body></html>

Esto se soluciona contactando al servicio de hosting. En mi caso, BlueHost me lo solucionó a través del servicio de soporte por chat en minutos, simplemente poniendo en la whitelist la URL del xmlrcp.php

Próximamente seguiremos con más ejemplos, les recomiendo que lean este post que me explicó cómo hacer la primera prueba: http://www.juust.org/index.php/metaweblog-newpost-posting-to-wordpress-from-word/2009/10/

Hasta la próxima!

jueves, 19 de junio de 2014

Do you want to save changes to the design of form

Cuando hacemos un cambio al diseño de un formulario en formato DataSheet, aparece un mensaje "¿Do you want to save changes to the design of form ...?"



Presionamos YES y creemos que los cambios se han grabado, pero no es así. Esto ocurre a veces con cambios como el ancho de una columna.

Un camino alternativo es:
  1. Hacer el cambio de diseño
  2. Cambiar a Vista de Diseño
  3. Grabar
Veremos que ahora sí el cambio de diseño no se habrá perdido.

Otro camino:

Si nuestro formulario posee sub formularios y el cambio lo estamos haciendo en el sub formulario, es probable que no se grave. La alternativa es abrir el sub formulario por separado y grabar. Ahora veremos que los cambios quedarán almacenados.

Alternativa 3 - Muy interesante!

1) Abrir el formulario en vista datasheet
2) Cambiar ancho u orden de columnas
3) Botón derecho "unhide fields"
4) Cerrar el formulario y aceptar los cambios de diseño

Funciona!
Fuente y otras variantes en: http://www.access-programmers.co.uk/forums/showthread.php?t=231625

miércoles, 14 de mayo de 2014

Verificar si existe una carpeta en Access (VBA)

Documentos = [Form_Certificados_Editor]![Documentos].Value & "\CRT\"
Documentos = Replace(Documentos, "#", "")
If Dir(Documentos, vbDirectory) <> vbNullString Then
            Camino = Documentos
End If

martes, 13 de mayo de 2014

Syntax error missing operation in query expression

Posiblemente se hayan encontrado con el error "Syntax error missing operation in query expression" al tratar de aplicar un filtro en una pantalla de tipo "hoja de datos" tal como se ve en esta imagen:



Este error se da porque los nombres de los campos tienes espacios:



Posibles soluciones:
  • Cambiar el nombre del campo en la base de datos
  • Utilizar un alias en el query cambiando el nombre a uno sin espacios
  • Encerrar entre corchetes el campo en Control Source (ver imagen)


En cualquier caso, hay que analizar el impacto y probar los cambios.
Saludos!

lunes, 5 de mayo de 2014

Conectarse a SQL Server Management Studio con diferentes credenciales de Windows

Supongamos que necesitamos conectarnos a SQL Server Management Studio con credenciales de Windows pero escritas manualmente. Este puede ser el caso en que estemos conectados a través de una VPN al servidor, pero sin acceso a un escritorio remoto.

Estos son los pasos a seguir:

1) Administrador de credenciales

Dentro del Panel de Control de Windows 7, agregamos las credenciales del servidor SQL, incluyendo el puerto:


2) Ejecutamos SSMS con un Run As

Desde la línea de comando (CMD), por ejemplo ejecutando este comando:

runas /netonly /user:bla\blabla "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe"

3) Especificando parámetros adicionales en SQL Server Management Studio

En la pantalla de login, seleccionamos credenciales de Windows:

Luego hacemos clic en Options / Additional Connection Parameters y escribimos algo así:

Integrated Security=SSPI;User ID=bla\blabla;Password=bla



Luego "Connect" y listo!




viernes, 11 de abril de 2014

¿Cómo utilizar el formato condicional en una vista de tipo DataSheet en Access?

Supongamos que queremos que una columna cambie el color de fondo en base a una condición, como el valor de un campo en una vista de tipo DataSheet. Para ello usamos la opción de Formato condicional, tal como se ve en esta imagen:



Creamos una regla:



Y finalmente obtenemos el resultado:


Hasta la próxima!