wissel.net

Usability - Productivity - Business - The web - Singapore & Twins

<strike>I need a</strike> DXL/XML guru&apos;s advise!


I'm working on a project, that will reunite a bunch of databases that once were one back into a common template. One tool that worked very well is DXL export, XSLT transformation and importing that stuff back. I'm using the Body field of a Notes document to store the DXL, which creates some kind of documentation/audit trail. This morning we hit the wall.
I exported a rather complex form (a lot of subforms, multi-nested tables, hotspots and a lot of fields). When I tried to reimport the DXL untouched I was greeted with this error dialogue:

(For RSS readers: the message says: "Left margin cannot be greater than right margi". I did the msgbox, but that was the error in the DXL importer. Please note the typo/truncation. Anybody came across this and could advise what to do?

Update: I found a solution (and opened another can of worms)! The form I tried to export has quite a bit of "history" So in the table tag there is an attribute r4spacing="true". With this attribute set I get the error message. The attribute tells the designer to use the fixed values provided in refwidth="10.4778in". Once you remove the attribute "r4spacing" import works. Of course now the table rendering follows a different rule set, so it gets all messed up. Looks like another session in XSLT to clean this up.

This is the agent we use for import:

Sub Initialize
    'Exports DXL design elements from the base line code into a
    'database. Can be new, might exist

    Dim db As NotesDatabase
    Dim dCol As NotesDocumentCollection
    Dim newDB As NotesDatabase
    Dim doc As NotesDocument
    Dim rt As NotesRichTextItem
    Dim txtServerName As String
    Dim txtNewDBName As String

    Dim s As New NotesSession
    Set db = s.CurrentDatabase
    txtServerName = db.Server

    txtNewDBName = Inputbox("Create/Update db on "+txtServerName,"")
    If txtNewDBName = "" Then
             Exit Sub
    End If

    Set newDB = New NotesDatabase(txtServerName,txtNewDBName)
    If Not newDB.IsOpen Then
             'We need to create it!
             Call newDB.Create(txtServerName,txtNewDBName,True)
    Else
             If Msgbox("This DB does exist, update it? (Exisiting elements will be overwritten)",36) <> 6 Then
                     Exit Sub
             End If

    End If

    'Final check
    If Not newDB.IsOpen Then
             'Something went wrong!
             Msgbox"Can't open the selected database, I'm sorry!"
             Exit Sub
    End If

    Set dCol = db.UnprocessedDocuments
    Set doc = dCol.GetFirstDocument

    Do Until doc Is Nothing
             If doc.HasItem("Body") Then
                     Set rt = doc.GetFirstItem("Body")
                     If doc.HasItem("Subject") Then
                              Print "Working on " & doc.subject(0)
                     End If
                     Call ImportDXLfromRT(rt,newDB)
             End If
             Set doc = dCol.GetNextDocument(doc)
    Loop

End Sub

Sub ImportDXLfromRT(rt As NotesRichTextItem, db As NotesDatabase)
Dim dxi As NotesDXLImporter

    On Error Goto Err_ImportDXLfromRT

    Dim s As New NotesSession
    Set dxi = s.CreateDXLImporter

    'Set the import to ONLY import design elements
    dxi.ACLImportOption = DXLIMPORTOPTION_IGNORE
    dxi.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_CREATE
    dxi.DocumentImportOption = DXLIMPORTOPTION_IGNORE
    dxi.ReplaceDBProperties = False
    dxi.ReplicaRequiredForReplaceOrUpdate = False

    'Set the source to RT and the target to the db
    Call dxi.setInput(rt)
    Call dxi.setOutput(db)
    Call dxi.process

Exit_ImportDXLfromRT:
Exit Sub

Err_ImportDXLfromRT:
'Error from dxi
Print Error$
Msgboxdxi.log
ResumeExit_ImportDXLfromRT

End Sub

As usual YMMV

Posted by on 05 July 2005 | Comments (1) | categories: IBM Notes Lotus Notes

Comments

  1. posted by null on Tuesday 25 March 2008 AD:
    Emoticon wink.gif