MySQL no procesa texto enriquecido desde VB6?

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • MySQL no procesa texto enriquecido desde VB6?

    Saludos.
    Expongo lo que estoy viendo como un problema y punto negativo para MySQL.

    No registra correctamente texto enriquecido enviado desde VB6.
    Comento las cosas que he intentado:

    1. Guardar el dato como .Text o .TextRTF
    2.Usando tipo de dato Varchar.
    3. Usando tipo de dato Text.
    4. Enviando los datos en binario mediante ADO-Stream

    No quiero:
    Guardar el archivo en local, porque la idea es que accedan a esa información desde cualquier estación.

    De momento la opción "absurda" ha sido de pasar ese dato por access antes de devolverlo al RichTextbox porque sencillamente Access si puede...

    Alguien ha visto alguna solución para este incomodo problema de MySQL?

  • #2
    Yo uso un campo de tipo MEDIUMBLOB y en él grabo el texto como documento.doc o .rtf sin ningún tipo de problema, en ocasiones con varias páginas.
    José María Movilla Cuadrado
    ______________________
    Normas del foro
    www.foro.vb-mundo.com
    www.vb-mundo.com

    Comentario


    • #3
      Originalmente escrito por J_M_Movilla Ver mensaje
      Yo uso un campo de tipo MEDIUMBLOB y en él grabo el texto como documento.doc o .rtf sin ningún tipo de problema, en ocasiones con varias páginas.

      Lo he puesto como tu... MEDIUMBLOG

      Guardo: como txtficha.TextRTF

      Cuando cargo el registro asigno sus datos asi:

      txtficha.TextRTF = Rs!ficha

      pero me devuelve: ?????????????????????????????????????????????????? ???????????????????????????????????<???????'?????? ?????????????????????????????

      Comentario


      • #4
        Voy a intentar aproximarte a mi forma de trabajar con documentos de gran tamaño, grabados en la base de datos MySQL. Reconozco que te va a costar un tanto el comprenderlo y aplicarlo, pero una vez llegues a realizarlo, te será muy útil:

        En un Módulo añade esta línea:
        Código:
                    Public m_stream As ADODB.Stream
        ' ---------------------------------------------------------------------------

        Pon en la tabla que te interese los campos que te indico en la imagen "Fields.JPG" que adjunto.

        ' ---------------------------------------------------------------------------

        Los textos conviértelos en un archivo .rtf de WinWord

        Para grabar un documento (archivo.rtf) usa este código, donde X es una variable lógica, cNDoc es el NUMDOC, txtNew el TITULO y wFich el DOCUM (de Word, que puede ser .doc, .docx, YO PREFIERO .rtf)
        ConexMySQL es mi conexión a la DB MySQL
        documen es el nombre de la tabla en que guardo los documentos

        Código:
            X = GrabaDoc(cNDoc, txtNew, wFich)
        ' ---------------------------------------------------------------------------

        Código:
        Public Function GrabaDoc(cNumD, cTitu, xDoc)
            Dim SQL As String
            Dim rsTemp As New Recordset
        
            SQL = "SELECT * FROM documen WHERE Titulo like '" &amp; cTitu &amp; "'"
            With rsTemp
                If .State Then .Close
                .Open SQL, ConexMySQL, adOpenStatic, adLockOptimistic
                ConexMySQL.BeginTrans
                If .RecordCount Then
                    ' Si ya tengo grabado ese documento, primero lo borro para evitar repeticiones
                    SQL = "DELETE From documen WHERE Titulo like '" &amp; cTitu &amp; "'"
                    ConexMySQL.Execute SQL, , adCmdText
                End If
                SQL = "INSERT INTO documen (NumDoc, Titulo, Docum) VALUES ('" &amp; cNumD &amp; "', '" &amp; cTitu &amp; "', ' ')"
                ConexMySQL.Execute SQL, , adCmdText
                ConexMySQL.CommitTrans
                DoEvents
                .Close
                ConexMySQL.BeginTrans
                SQL = "SELECT * FROM documen WHERE Titulo like '" &amp; cTitu &amp; "'"
                .Open SQL, ConexMySQL, adOpenStatic, adLockOptimistic
                Set m_stream = New ADODB.Stream
                m_stream.Type = adTypeBinary
                m_stream.Open
                m_stream.LoadFromFile xDoc
        
                '  ATENCIÓN A CÓMO GUARDAR EL DOCUMENTO
                .Fields("DOCUM").value = m_stream.Read
                .Update
                ConexMySQL.CommitTrans
                DoEvents
                .Close
            End With
        End Function
        ' ---------------------------------------------------------------------------
        Y para leer el documento:

        wFich es una variable String
        cNDoc es el Número de documento que quiero leer (puedes, lógicamente, buscar su TITULO)

        Código:
               wFich = LeeDoc(cNDoc)
        ' ---------------------------------------------------------------------------

        Código:
        Public Function LeeDoc(cNumD)
            SQL = "SELECT * FROM documen WHERE NumDoc = '" &amp; cNumD &amp; "'"
            On Error GoTo VerError
            With rsTemp
                If .State Then .Close
                .Open SQL, ConexMySQL, adOpenStatic, adLockOptimistic
                If .RecordCount Then
                    X = cGoeDoc &amp; !TITULO
                    Set m_stream = New ADODB.Stream
                    m_stream.Type = adTypeBinary
                    m_stream.Open
                    m_stream.Write .Fields("DOCUM").value
                    ' -- Pasa el documento a archivo en disco local
                    m_stream.SaveToFile X &amp; ".rtf", adSaveCreateOverWrite
                End If
                .Close
                LeeDoc = X &amp; ".rtf"
            End With
            Exit Function
        VerError:
            rsTemp.Close
            LeeDoc = ""
        End Function
        ' ---------------------------------------------------------------------------

        Y una vez que hayas obtenido el wFich, lo tratas así:

        Código:
            Dim W As New Word.Application
        
            W.Documents.Open (wFich)
            With W.ActiveDocument
                .AutoHyphenation = True
                .HyphenateCaps = True
                .HyphenationZone = W.CentimetersToPoints(0.75)
                .ConsecutiveHyphensLimit = 0
            End With
            DoEvents
            W.Caption = "MS-Word - Actualizando la Plantilla"
            W.WindowState = wdWindowStateMaximize
            
            ' Si declaras en un módulo SetWindowPos como te indico más abajo, puedes usar esta línea
                             ' para poner tu Aplicación en segundo plano (queda Word en primer plano)
            SetWindowPos Me.hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
            W.Visible = True
                
            Err = 0
            On Error Resume Next
        
        Repite:
            If Err = 0 Then
                If W.Visible Then DoEvents: GoTo Repite
            End If
            DoEvents
            On Error GoTo 0
        
            Set W = Nothing
            DoEvents
        ' ---------------------------------------------------------------------------

        Declaración que debe ir en un módulo

        Código:
        ' Para traer Word o Excel a primer plano
        Public Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cY As Long, ByVal wFlags As Long)
        Public Const HWND_BOTTOM = 1
        Public Const SWP_NOSIZE = &amp;H1
        Public Const SWP_NOMOVE = &amp;H2
        Public Const SWP_NOACTIVATE = &amp;H10
        Public Const SWP_SHOWWINDOW = &amp;H40
        Public Const SWP_NOZORDER As Long = &amp;H4&amp;
        Archivos adjuntos
        José María Movilla Cuadrado
        ______________________
        Normas del foro
        www.foro.vb-mundo.com
        www.vb-mundo.com

        Comentario


        • #5
          Saludos Sr J_M_Montilla... muchas gracias por tu tiempo. EL código que me pasaste lo pude leer fácil.. está muy bien redactado.

          Te comento que aunque fácil de leer y entendible, no lo he usado. Y te comento la razón:

          Me estaba angustiando el saber que Access lo hace muy fácil, pero MySQL para lograr algo, me ponía a dar muchas vueltas: Guardar en local, leer, convertir en binario, y viceversa si quería cargar...

          Estuve revisando en sumo detalle cual es la diferencia, y la he encontrado:
          • Cuando guardamos el registro en Access en un campo MEMO, se guarda con total normalidad.
          • Cuando guardamos el registro en MySQL en un campo Text, se guarda con un ligero error... resulta que MySQL por configuración local siempre omite el caracter ( \ ), entonces hice lo siguiente:
          Código:
          Dim Archivo
          
          Archivo = replace(txt_Ficha.TextRF, "\","\\")
          Y problema solucionado. Ahora si lo hace tan fácil como el viejo confiable de Access.

          Espero que este aporte también pueda servirle a alguien más.

          Lo probé en DataReport y ActiveReport y me genera el reporte tal cual y como lo he editado.

          Comentario


          • #6
            Me alegra el ver que has encontrado la solución a tu problema, y de una forma tan sencilla como la que has conseguido. La verdad es que mi sistema lo utilizo para grabar documentos (los CV que envían los alumnos y las plantillas que sirven para comunicar a empresas y alumnos los eventos relacionados con ofertas de empleo y contratos). Esto es muy distinto a lo que haces tú, aunque me pareció que podría serte útil. Mejor que hayas encontrado un método más simple y más eficaz.
            José María Movilla Cuadrado
            ______________________
            Normas del foro
            www.foro.vb-mundo.com
            www.vb-mundo.com

            Comentario


            • #7
              Originalmente escrito por J_M_Movilla Ver mensaje
              Me alegra el ver que has encontrado la solución a tu problema, y de una forma tan sencilla como la que has conseguido. La verdad es que mi sistema lo utilizo para grabar documentos (los CV que envían los alumnos y las plantillas que sirven para comunicar a empresas y alumnos los eventos relacionados con ofertas de empleo y contratos). Esto es muy distinto a lo que haces tú, aunque me pareció que podría serte útil. Mejor que hayas encontrado un método más simple y más eficaz.
              Por supuesto que lo hiciste tiene una aplicación distinta pero muy interesante. Creo saber en que parte si me será muy util.
              Gracias por tu genial aporte.

              Comentario

              Trabajando...
              X