AQ Queue Message Sort

Hi,
I have a requirement to dequeue message based on sort. 2 columns...Column1,column2
Example Message in Queue
(Column1) ID : If varchar2 (Alpha Numiric)
(Column2) Time format : (HH:MM:SS Format Time) Format can be changed if required. This is not same as enqueue time
Message1 : ID: 1A00 Time : 01:11:12
Message2 : ID: 1A00 Time : 01:13:12
Message3 : ID: 1B00 Time : 01:14:12
Message4 : ID: 1A00 Time : 01:15:12
Message5 : ID: 1B00 Time : 01:17:12
Message6 : ID: 1B00 Time : 01:24:12
Message7 : ID: 1A00 Time : 01:19:12
I want this to be reordered such that Message with latest Time per ID is at top. i.e I only want latest message per ID rest can be ignored.
Message7: ID: 1A00 Time : 01:19:12
<Ignore rest of message with ID =1A00>
Message6 : ID: 1B00 Time : 01:24:12
<Ignore rest of message with ID =1B00>
Note: I want to have this thing implemented in Queue.
Like : select ID, max(Time) from table_name group by ID order by ID

Hi,
I have a requirement to dequeue message based on sort. 2 columns...Column1,column2
Example Message in Queue
(Column1) ID : If varchar2 (Alpha Numiric)
(Column2) Time format : (HH:MM:SS Format Time) Format can be changed if required. This is not same as enqueue time
Message1 : ID: 1A00 Time : 01:11:12
Message2 : ID: 1A00 Time : 01:13:12
Message3 : ID: 1B00 Time : 01:14:12
Message4 : ID: 1A00 Time : 01:15:12
Message5 : ID: 1B00 Time : 01:17:12
Message6 : ID: 1B00 Time : 01:24:12
Message7 : ID: 1A00 Time : 01:19:12
I want this to be reordered such that Message with latest Time per ID is at top. i.e I only want latest message per ID rest can be ignored.
Message7: ID: 1A00 Time : 01:19:12
<Ignore rest of message with ID =1A00>
Message6 : ID: 1B00 Time : 01:24:12
<Ignore rest of message with ID =1B00>
Note: I want to have this thing implemented in Queue.
Like : select ID, max(Time) from table_name group by ID order by ID

Similar Messages

  • Advantages of Using Queued Message Handler vs. Standard State Machine

    Hello,
    What are the advantages of using a Queued Message Handler?  Also, why are they more powerful than using Standard State Machines?
    Thanks!

    They are really just sort of an extension of a state machine.  The general idea is that you have one loop doing a specific job.  You then use a queue to tell it how/when to do this job.  For instance, I might have a log file loop.  I will send it commands to open a file, write some data, write some more data, and finally close the file.  Each of those commands are coming from the queue.  The beauty with this setup is that anybody that can get a reference to that queue can send the command to that loop.
    So the QMH is "better" than a state machine mostly because of the decoupling of functions.  In a given application, I will have a loop for log file writing, GUI updates, reading of a DAQ, instrumenet communications, server communications, etc.  Trying to do all of that in a single loop state machine is a major pain in the rear end.  Seperating them out makes life so much easier.
    There are only two ways to tell somebody thanks: Kudos and Marked Solutions
    Unofficial Forum Rules and Guidelines

  • How do you build a web page to display queued messages ?

    How do you build a web page to display queued messages in all states?
    Thanks,
    Reeta
    Reeta Joseph Benoy
    EDS@XEROX
    Database Administration
    1350 Jefferson Rd
    Rochester, NY 14623

    You can build a form to a procedure in oracle portal that explores the queue with the option browse and prints de type message with htp package. I made it in this way and my applicattion works right. The procedure must loop the select count(msgid) from aq$[queuetable_name] times.

  • Exception queue messages

    is there anyway to dequeue exception queue messages
    my main queue is multiconsumer
    Message was edited by:
    JAA

    i ll answer my question
    first set exception queue dequeue enable
    BEGIN
    dbms_aqadm.start_queue(queue_name => 'aq$_request_qt_e',dequeue => TRUE,enqueue => FALSE);
    END;
    then dequeue messages with null consumer name ;)

  • Watch all queue message in xi/pi

    Hello Experts,
       I want to see all queue messages coming to xi and going out of xi. Is there any Tcode to watch queue messages.
    I use SMQ1 and SMQ2 to see qRFC queue messages. But i want to see all messages.
    Kindly help me in this regard.
    Thanks in advance.

    Hi tatireddy kiran
    if you want to minitor on abap stack (integration engine) then run tcode SXI_MONITOR
    fill up the crieteria and there you can search all the message whether its QOS is BE , EO or EOIO
    if you want to monitor java stack (adapter engine )
    then run tcode SXMB_IFR got to RWB -> message monitoring and there give the filter and you can see the messages and there status
    Regards
    sandeep

  • Where to store data (queued message handler)

    Hello,
    i'm developing an image processing application. As a template i'm using the 'queued message handler'. In my app I need to store some images, arrays, and so on in RAM. Now the question is  if i should store that data in the message loop's shift register (in a cluster) or somewhere else.
    At the moment i have hidden front panel indicators where i store all my data. This isn't good practise, is it?
    thanks alot
    MN

    nollMarvin wrote:
    Hello,
    i'm developing an image processing application. As a template i'm using the 'queued message handler'. In my app I need to store some images, arrays, and so on in RAM. Now the question is  if i should store that data in the message loop's shift register (in a cluster) or somewhere else.
    At the moment i have hidden front panel indicators where i store all my data. This isn't good practise, is it?
    thanks alot
    MN
    No that is not good practice.
    A Shift register is a much better place to store data in memory it does that without creating copies the OS must interperate for display.  (Yeah the displaying of data to a user is a different concept than having data in memory) Ben's famous Action Engine Nugget is always a good read. http://forums.ni.com/t5/LabVIEW/Community-Nugget-4-08-2007-Action-Engines/m-p/503801
    And a basic concept to LabVIEW that attending a training session (or asking questions on these forums) will help you master
    Jeff

  • JMS Queue Messages not picked up.

    Hello,
    We are facing below issue frequently, any help in this regard would be highly appreciated.
    We have 2 MDB's listening to the a queue on WLS 8.1 SP2. We are using Message Selector to identify which of the 2 MDB's should pick up the message.
    The issue is that if too many messages are queued up, then the MDB at times doesn't pick them up, even when free instances of MDB are available in the Bean Pool.
    But if we restart the server then all the messages are picked up instantly. Server restart acts as some kind of Trigger for the Queued Messages to be picked up instantly.
    We have been trying to explore as to why this happens, but havent still resolved it.
    Any ideas would be appreciated.
    Thanks.
    Khyati

    Hello,
    We are facing below issue frequently, any help in this regard would be highly appreciated.
    We have 2 MDB's listening to the a queue on WLS 8.1 SP2. We are using Message Selector to identify which of the 2 MDB's should pick up the message.
    The issue is that if too many messages are queued up, then the MDB at times doesn't pick them up, even when free instances of MDB are available in the Bean Pool.
    But if we restart the server then all the messages are picked up instantly. Server restart acts as some kind of Trigger for the Queued Messages to be picked up instantly.
    We have been trying to explore as to why this happens, but havent still resolved it.
    Any ideas would be appreciated.
    Thanks.
    Khyati

  • Delete queued messages having env_from=

    I have an iMS 5.2 on Solaris 8, but I cannot manage to delete queued messages having env_from = "<>".
    Exact command I use:
    qm.maint> clean -env_from= "<>" -delete -min_length=2
    Can anybody help?

    Actually, this sounds like a "Bad Idea". Messages from the server itself normally have no env_from, so you'd be removing notifications that mail did not go through. Perhaps if you explained why you wish to do this, we can help you achieve your goals a different way.

  • Delete queued messages

    Hi all,
    We have IMS 5.2 running Solaris8. I am investigating the smtpout log files, the status attribute for the email shows that it cab be E for enqued, D for Dequed or some other status with error sending to the other smtp destination. Now in the imsimta queue management, if I need to delete only the emails with error status, how can I do this? I mean if I run the "held" sub command then delete it will not delete all the emails with error status, and if I run the "directory channel" then delete then all the emails will be deleted regardless of the status. Is there a solution ?
    Many thanks in advance

    I would first lengthen the "backoff" stuff, so queued messages don't get retried so often.
    You can also reduce the notices timeout, though I would go gently, so you don't return valid mail for servers that may actually be down.

  • How to get Uniform distributed queue message counts with help of JMX

    Hi,
    Is there any way to get given queue message count, pending message counts using JMX. I can get all queue names and counts using JMX... after that i have to show only selected queue details.
    Thanks,
    -Som

    Hi,
    Following is the WLS snippet from an upcoming WLS JMS message management white paper that you can use to get the message statistics for a given destination.
    With appropriate command line parameters, this script can be used to poll and dump the statistics of any destination on a specified interval.
    Note that the WLST uses JMX API under the cover, so you can easily convert this into a pure JMX java program.
    Hope this helps.
    Kats
    WebLogic JMS Message Statistics Script for weblogic.WLST
    This script can be used for dumping message statistics of a given JMS Destination.
    Based on the arguments, the script creates can print out message statistics
    Usage: java weblogic.WLST msg_statistics.py [options]
    Options:
      username=...           username to connect to WebLogic Server       - defaults to "weblogic"
      password=...           password to connect to WebLogic Server       - defaults to "weblogic"
      url=...                Provider URL of the Administration Server    - defaults to "t3://localhost:7001"
      wlsServerName=...      WebLogic Server Name                         - defaults to "examplesServer"
      jmsServerName=...      JMS Server Name that hosts the destination   - defaults to "examplesJMSServer"
      jmsModuleName=...      JMS Module Name that defines the destination - defaults to "examples-jms"
      jmsDestinationName=... JMS Destination name to get the statistics   - defaults to "exampleQueue"
      pollingIntervalInSeconds=... Time interval between statistics dump  - defaults to "60 secs"
      redirectStdout=...     File name to redirect the stdout of WLST     - defaults to no redirect and the results wil be printed out to stdout.
      help                   Prints out this usage help
    Note that all the defaults are set based WebLogic Examples domain that is part of WebLogic Server installation.
    The "examples" server can be started from "C:/Oracle/Middleware/wlserver_10.3/samples/domains/wl_server" using startWebLogic.sh
    To try this script OOTB, start the "examples" server and run the JMS sample as described below.
    cd :/Oracle/Middleware/wlserver_10.3/samples/domains/wl_server/bin
    . ./setDomainEnv.sh
    cd $WL_HOME/samples/server/examples/src/examples/jms/queue
    javac -d . *.java
    export CLASSPATH=".;$CLASSPATH"
    java examples.jms.queue.QueueSend t3://localhost:7001
    Follow the prompts to populate the queue
    Examples:
      msg_statistics.py - Dump the message statistics of the exampleQueue for every 1 min
      msg_statistics.py user=weblogic pass=weblogic url=t3://localhost:7001
                          wlsServerName=examplesServer jmsServerName=examplesJMSServer
                    jmsModuleName=examples-jms jmsDestinationName=exampleQueue
                    pollingIntervalInSeconds=30
    For more details on JMS Message Management using WLST, see "WebLogic JMS Message Management In a Nutshell" whitepaper.
    from weblogic.jms.extensions import JMSMessageInfo
    from weblogic.messaging.kernel import Cursor
    from javax.jms import TextMessage
    from javax.jms import DeliveryMode
    from java.io import ByteArrayOutputStream
    from java.io import StringBufferInputStream
    from java.util import Properties
    from java.util import Date
    from java.lang import *
    import jarray
    import sys
    # shows_messages() definition
    def dump_statistics(wlsServerName, jmsServerName, jmsModuleName, jmsDestinationName, pollingIntervalInSeconds):
      pollingIntervalInMillis = long(pollingIntervalInSeconds) * 1000L
      domainRuntime()
      cd ('ServerRuntimes')
      spath = wlsServerName + "/JMSRuntime/" + wlsServerName +".jms"
      cd (spath)
      fullDestName=jmsServerName+'/Destinations/'+jmsModuleName +'!'+jmsDestinationName
      cdPathForDestName='JMSServers/'+ fullDestName
      cd (cdPathForDestName)
      while 1:
        print "========================================================================================================================"
        print "Messages     Messages      Messages      Messages      Bytes        Bytes        Bytes           Bytes    "
        print "Current       Pending       High          Received      Current      Pending      High            Received "
        print "Count         Count         Count         Count         Count        Count        Count           Count    "
        print "========================================================================================================================"
        s = "%8d     %8d     %8d     %8d     %8d     %8d     %8d     %d" % (cmo.getMessagesCurrentCount(), cmo.getMessagesPendingCount(), cmo.getMessagesHighCount(), cmo.getMessagesReceivedCount(), cmo.getBytesCurrentCount(), cmo.getBytesPendingCount(), cmo.getBytesHighCount(), cmo.getBytesReceivedCount())
        print s
        print ''
        Thread.sleep(long(pollingIntervalInMillis))
    # Function to handle script arguments of the variety 'n=v', where
    # arguments are placed into a dictionary of nv pairs and returned
    # to the caller
    def argsToDict(args):
      d = {}
      for arg in args:
        #print "arg: " + arg
        pair = arg.split('=', 1)
        #print "pair: " + str(pair)
        if len(pair) == 2:
          # binary argument, store as key pair
          key = pair[0]
          val = pair[1]
          d[key] = val
        else:
          # Unary argument, story with empty (non-null) key
          d[arg] = ''
      print "Arguments: " + str(d)
      return d
    # Returns the value found in the provided map, at the location
    # specified by 'key'; if no entry exists in the map for 'key',
    # the provided default is returned.
    def getValue(dict, key, default=None):
      ret = default
      if dict is not None:
        try:
          ret=dict[key]
        except KeyError:
          pass
      return ret
    # Connect to the target server specified in the provide args
    def connectIfNecessary(argsDict=None):
      # connect if necessary
      if connected == "false":
        user=getValue(argsDict, "user", "weblogic")
        passwd=getValue(argsDict, "pass", "weblogic")
        url=getValue(argsDict, "url", "t3://localhost:7001")
        print "Connecting with [" + user + "," + passwd + "," + url + "]"
        connect(user,passwd,url)
    # Retrieve a positional argument if it exists; if not,
    # the provided default is returned.
    # Params:
    # pos   The integer location in sys.argv of the parameter
    # default  The default value to return if the parameter does not exist
    # returns the value at sys.argv[pos], or the provided default if necesssary
    def getPositionalArgument(pos, default):
      value=None
      try:
        value=sys.argv[pos]
      except:
        value=default
      return value
    # Main
    argsDict = argsToDict(sys.argv)
    redirectOutputFileName = getValue(argsDict, "redirectStdout")
    if redirectOutputFileName is None:
      pass
    else:
      redirect(redirectOutputFileName, 'false')
      print "The output from this program gets written into file " + redirectOutputFileName
      sys.stdout = open(redirectOutputFileName, "w")
    isHelp = getValue(argsDict, "help")
    if isHelp is None:
      pass
    else:
      print __doc__
      exit()
    connectIfNecessary(argsDict)
    wlsServerName = getValue(argsDict, "wlsServerName", "examplesServer")
    jmsServerName = getValue(argsDict, "jmsServerName", "examplesJMSServer")
    jmsModuleName = getValue(argsDict, "jmsModuleName", "examples-jms") 
    jmsDestinationName = getValue(argsDict, "jmsDestinationName", "exampleQueue")
    pollingIntervalInSeconds = getValue(argsDict, "pollingIntervalInSeconds", "60")
    dump_statistics(wlsServerName, jmsServerName, jmsModuleName, jmsDestinationName, pollingIntervalInSeconds)
    disconnect()
    print 'End of script ...'
    exit() 

  • I need tips about queued message handler

    Hello, I have to use, for the first time a queued message handler. I'd like to know what is the best way to share data between cases in a loop and from a loop to another, I think with local variables  isn't  the best way...
    However all the tips on the queued message handler are welcome!!!
    Thanks

    smilegv wrote:
    I'd like to know what is the best way to share data between cases in a loop
    Shift registers.  Doesn't matter if QMH, State Machine, Producer-Consumer, etc.
    smilegv wrote:
    I'd like to know what is the best way to share data ...from a loop to another
    Well, now that completely depends on what you are passing around.  Streaming data?  Use a Queue or User Event.  Last known value (ie Tag)?  Global Variables, Action Engine.
    There are only two ways to tell somebody thanks: Kudos and Marked Solutions
    Unofficial Forum Rules and Guidelines

  • Queued Message Handler Project Template

    Hello,
    Currently prepping for CLD exam.
    I was told we could use LV 2012 Professional Version.  Is it OK during exam to use Project template for Queued Message Handler to generate VIs and block diagram code?  Or must a QMH be generated from scratch?  
    I assume there will be a main VI which we must modify, but the thought was to reuse the generated template code into this VI.
    Thank you,

    You can use templates, examples etc that ships with LabVIEW. I am sure I read this somewhere, will post a link if I find it.
    Here is one tip offered by one of the experts: http://forums.ni.com/t5/Certification/Car-Wash-REV​IEW/m-p/2267688#M540
    Beginner? Try LabVIEW Basics
    Sharing bits of code? Try Snippets or LAVA Code Capture Tool
    Have you tried Quick Drop?, Visit QD Community.

  • How best to decouple the UI in the LV 2012 Queued Message Handler Template?

    If you create a new "Queued Message Handler" from the new LV 2012 Template, you'll see a blue box in the "Update Display" case which says the following:
    Code Recommended - If you wish to decouple the Message Handling Loop from your user interface, consider creating User Events (like the "Stop" event in this VI) to message the Event Handling Loop whenever the user interface needs updating.
    I'd like to give this suggestion a shot but I'm struggling to find the best way to do this and still keep the code modular.  The template creates a "User Event - Stop.lvlib" with Create/Destroy/Fire SubVI's.  I would like to create a similar "User Event - Update UI.lvlib" library with similar Create/Destroy/Fire SubVI's to keep this new user event separate and modular.  The problem I'm hitting is that there can only be one Dynamic Event Terminal in the Event Structure so how do I modularlize creating user events into separate SubVIs and still maintain this one Dynamic Event Terminal?
    As a follow on question, would it be best to have one user event library per indicator that needs updating or just one single UI update user event and then pass a cluster as the message which contains the name of the control to update (to be used with a case structure) and then the data to go along with it?
    Thanks!
    Solved!
    Go to Solution.
    Attachments:
    CLD.png ‏10 KB

    Instead of having the Register Events in the "Create Methods" you could do that part outside your "create" SubVIs and then simply bundle them. Then you create your individual User Event handling. See snippet where i created a "Create User Event - Update" vi in front of the Stop.
    “A child of five could understand this. Send someone to fetch a child of five.”
    ― Groucho Marx

  • Is there any way to configure storage queue message encoding for Web Job's QueueTrigger?

    We have a web job that listens to Azure storage queue via QueueTrigger. The queue messages are not encoded when they are added to the queue:
    CloudStorageAccount account = CloudStorageAccount.Parse("...");
    CloudQueueClient client = account.CreateCloudQueueClient();
    CloudQueue queue = client.GetQueueReference("test1");
    queue.EncodeMessage = false;
    queue.AddMessage(new CloudQueueMessage("hello world"));
    And in the web job, we use the below method to listen to the queue.
    public static Task ProcessQueueMessageAsync([QueueTrigger("test1")]string message)
    And the web job crashes when it gets a message, with the below output. Unfortunately we cannot control the encode setting of the coming messages. So, our question is, is there any way to configure queue message encoding for Web Job's QueueTrigger?
    Thank you for any help and/or suggestion.
    Found the following functions:
    WebJobTest1.Functions.ProcessQueueMessageAsync
    Job host started
    Unhandled Exception: System.FormatException: Invalid length for a Base-64 char array or string.
    at System.Convert.FromBase64_Decode(Char* startInputPtr, Int32 inputLength, Byte* startDestPtr, Int32 destLength)
    at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
    at System.Convert.FromBase64String(String s)
    at Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage.get_AsString()
    at Microsoft.Azure.WebJobs.Host.Storage.Queue.StorageQueueMessage.get_AsString()
    at Microsoft.Azure.WebJobs.Host.Queues.StorageQueueMessageExtensions.TryGetAsString(IStorageQueueMessage message)
    at Microsoft.Azure.WebJobs.Host.Queues.QueueCausalityManager.GetOwner(IStorageQueueMessage msg)
    at Microsoft.Azure.WebJobs.Host.Queues.Listeners.QueueTriggerExecutor.<ExecuteAsync>d__0.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Azure.WebJobs.Host.Queues.Listeners.QueueListener.<ProcessMessageAsync>d__11.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at Microsoft.Azure.WebJobs.Host.Timers.BackgroundExceptionDispatcher.<>c__DisplayClass1.<Throw>b__0()
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    at System.Threading.ThreadHelper.ThreadStart()
    Press any key to continue . . .

    Hi,
    Thanks for posting here.
    I am not too sure if the storage queue messages can be encoded before the webjob listens to it.
    I am currently researching to gather more information with regards to your request.
    I shall revert back to you with an update at the earliest.
    Sincerely appreciate your patience.
    Regards,
    Shirisha Paderu

  • Message sort order

    I want to change the default message sort order so messages are listed by most recent first, instead of oldest first in the mailbox.
    I've been reading about modifying the message list here:
    http://docs.sun.com/source/816-6010-10/uicst.htm#13511
    and just want to confirm that if I modify the meSortOrder variable in the main.js file, will that change the default message list for all existing mailboxes displayed in webmail?
    Also, does anyone know for sure whether the variable to list the newest messages first is meSortOrder=last or meSortOrder=L ???
    My system specs:
    iPlanet Messaging Server 5.1 Patch 1 (built Jun 6 2002)
    libimta.so 5.1 Patch 1 (built 06:07:28, Jun 6 2002)
    HP-UX wwcc B.11.00 A 9000/879 674411361 two-user license
    Thank you - Forrest

    Yes, thank you Jay - and I am working towards that now - in part due to the information you shared.
    But the question I am faced with will remain, can I change the default webmail message display from "oldest first" to "oldest last" on the system level. And at this time, I'm not sure if a newer version will change that default.
    So, from what I've read, in part from this Messenger Express customization guide:
    http://docs-pdf.sun.com/816-5986-10/816-5986-10.pdf
    you need to change the SortOrder variable to 'last' in the main.js.
    From my tests, this does not work. There seem to be preset variables options, and 'last' is not one of them. However, there are two more variables that look like they could affect this change: 'sorting' and 'orgSort'. Does anyone know how to change this setting to have the newest messages displayed first?
    Thank you,
    Forrest

Maybe you are looking for

  • Sales Analysis on Item Delivery issue

    Hi Experts, I have another Issue regarding Deliveries at the same Client I posted this message on a few minutes ago: "Delivery Document not closed even though Invoice is linked" This issue relates to the Sales Analysis Report. When we open the Sales

  • I can no longer access my Time Capsule disk

    After upgrading to SL, I can't connect to the disk in my Time Capsule. It shows up in the Shared part of the Finder sidebar as usual, but clicking on it generates a gray bar that says "Connection Failed." On the right-hand side of this bar is a "Conn

  • Kernel Panic when I use Serial Port

    Hello, I have a macbook pro 15" 2.66 Ghz 2009 running Mountain Lion. I use Serial Ports for communicate with instruments via Matlab or CoolTerm, using bluetooth or USB. After some minute of work, my computer crash for kernel panic. This is the log fi

  • How to set the default y-axis chart as Number instread of Currency

    Hi,<BR><BR>1. New<BR>2. Chart<BR>3. select dimensions in Navigate window<BR>4. on y-axis the default display is "currency"<BR><BR>So I have to manualy change this settings:<BR>1. right mouse click and select Char Properties<BR>2. Axes tab<BR>3. selec

  • The Hard Way

    Looks like there will be some learning at the "professional's" expense. It starts with four identical books ordered - a wedding - and yes - the wedding date on an inside page is wrong. Lesson 1 - they don't proof your text -- date was September 16, 2