[AccessD] text between ( )

A.D. Tejpal adtp at airtelmail.in
Tue Dec 15 11:42:02 CST 2009


Pedro,

    For extracting & merging contents of multiple sets of ( ) occurring in source string, you could use following update query:

Sample update query:
======================================
UPDATE MyTable SET fldSelection = Fn_GetDataInBrackets([Concl]);
======================================

    Fn_GetDataInBrackets() as given below, is a user defined function.

Best wishes,
A.D. Tejpal
------------

' Code in general module
'======================================
Function Fn_GetDataInBrackets( _
            InputString As String) As String
    Dim Rtv As Variant, Cnt As Long
    Dim Txt As String, SubTxt As String
    Dim Pos As Long
    
    Txt = ""
    Rtv = Split(InputString, "(")
    If UBound(Rtv) > 0 Then
        For Cnt = 0 To UBound(Rtv)
            SubTxt = Rtv(Cnt)
            Pos = InStr(SubTxt, ")")
            If Pos > 1 Then
                Txt = Txt & Left(SubTxt, Pos - 1)
            End If
        Next
    End If
    
    Fn_GetDataInBrackets = Txt
End Function
'======================

  ----- Original Message ----- 
  From: Pedro Janssen 
  To: Access Developers discussion and problem solving 
  Sent: Tuesday, December 15, 2009 02:59
  Subject: Re: [AccessD] text between ( )


  Hello David,

  thanks again.

  Pedro


  ----- Original Message ----- 
  From: "David McAfee" <davidmcafee at gmail.com>
  To: "Access Developers discussion and problem solving" 
  <accessd at databaseadvisors.com>
  Sent: Monday, December 14, 2009 8:06 PM
  Subject: Re: [AccessD] text between ( )

  Just off the top of my head, I would run a second query to catch those.

  The Like statement would have to be like this:
  Like "*(*)*(*)*"

  This select statement should get you going in the right direction,
  look at the "Solution2" expression:
  SELECT YourTable.Concl,
  Mid([Concl],InStr(1,[Concl],"(")+1,(InStr(InStr(1,[Concl],"("),[Concl],")"))-1-(InStr(1,[Concl],"(")))
  AS Solution1, InStr(1,[Concl],"(") AS firstOpenPar,
  InStr(InStr(1,[Concl],"("),[Concl],")") AS firstClosepar,
  InStr([firstOpenPar]+1,[Concl],"(") AS 2ndOpenPar,
  InStr(InStr([2ndOpenPar],[Concl],"("),[Concl],")") AS 2ndClosepar,
  Mid([Concl],[2ndOpenPar]+1,[2ndClosepar]-1-[2ndOpenPar]) AS Solution2
  FROM YourTable
  WHERE (((YourTable.Concl) Like "*(*)*(*)*"));

  On Mon, Dec 14, 2009 at 10:23 AM, Pedro Janssen <pedro at plex.nl> wrote:
  > Hello david,
  >
  > thanks for your explanation.
  >
  > You say:
  > "A double situation will only result in the first set showing up:
  > Concl Expr1
  > abc(gta)xyz(gta2)lmo gta"
  >
  > How can i get this result for "A double stuation"
  > Concl Expr1
  > abc(gta)xyz(gta2)lmo gta & gta2
  >
  > Pedro
  >
  >
  > ----- Original Message -----
  > From: "David McAfee" <davidmcafee at gmail.com>
  > To: "Access Developers discussion and problem solving"
  > <accessd at databaseadvisors.com>
  > Sent: Monday, December 14, 2009 7:07 PM
  > Subject: Re: [AccessD] text between ( )
  >
  > Sorry about that. The Mid statement should read as follows:
  >
  > Mid([Concl],InStr(1,[Concl],"(")+1,(InStr(1,[Concl],")"))-1-(InStr(1,[Concl],"(")))
  >
  > That gives me:
  > PhoneNo Expr1
  > (818)5551212 818
  > (626)555-1212 626
  > (626)5554687 626
  > aaa (g2Ta)bbbbcccc g2Ta
  > aaaaa(g2Ta)cccccccdddddd g2Ta
  >
  > This gives us the 1st (open) parenthesis:
  > InStr(1,[Concl],"(")
  >
  > This gives us the 1st closed parenthesis
  > InStr(1,[Concl],")")
  >
  >
  > This is the length of everything between the two:
  > (InStr(1,[Concl],")"))-1-(InStr(1,[Concl],"("))
  >
  > If you have an closed parenthesis before the first open one, the
  > statement will give you an error:
  > Concl Expr1
  > 111)sdsf(ssgs)gsgs #Error
  >
  > If we replace the "1" in the closed statement, with the 1st open
  > statement, we can correct this error.
  > So instead of starting at position 1, we will start after the first
  > found open parenthesis
  > Mid([Concl],InStr(1,[Concl],"(")+1,(InStr(InStr(1,[Concl],"("),[Concl],")"))-1-(InStr(1,[Concl],"(")))
  >
  > Concl Expr1
  > 111)sdsf(ssgs)gsgs ssgs
  >
  > A double situation will only result in the first set showing up:
  > Concl Expr1
  > abc(gta)xyz(gta2)lmo gta
  >
  > Anything like this will be filtered out with the Like statement:
  > Concl Expr1
  > lalala)djjdjsdgs #Error
  > dfsdsgsg #Error
  > (sgsgsgssgs #Error
  >
  > HTH,
  > David McAfee
  >
  > On Mon, Dec 14, 2009 at 1:33 AM, Pedro Janssen <pedro at plex.nl> wrote:
  >> Hello David,
  >>
  >> the query, almost does what i want.
  >>
  >> SELECT Concl,
  >> Mid([Concl],InStr(1,[Concl],"(")+1,InStr(InStr(1,[Concl],"("),[Concl],")")-2)
  >> AS Expr1
  >> FROM YourTable
  >> WHERE (((Concl) Like "*(*)*"));
  >>
  >> - Only when there are more values with ( ) it only returns the first 
  >> value
  >> - The value that is returned ( ) also gives part of the rest of the concl
  >> text after the ) but sometimes it is cut off after a certain length and
  >> sometimes not. I Tried to variabel the "compare argument", but no result.
  >>
  >> for example (what the expression returns)
  >>
  >> Concl expr1
  >> aaa (g2Ta)bbbbcccc g2Ta)bbbbc
  >> aaaaa(g2Ta)cccccccdddddd g2Ta)ccccccccdddd
  >>
  >> i don't see the logic of the lengt of the text part after the ) in expr1
  >>
  >> How can i solve this?
  >>
  >> Pedro
  >>
  >> ----- Original Message -----
  >> From: "David McAfee" <davidmcafee at gmail.com>
  >> To: "Access Developers discussion and problem solving"
  >> <accessd at databaseadvisors.com>
  >> Sent: Wednesday, December 09, 2009 6:58 PM
  >> Subject: Re: [AccessD] text between ( )
  >>
  >> If this looks good:
  >> SELECT Concl,
  >> Mid([Concl],InStr(1,[Concl],"(")+1,InStr(InStr(1,[Concl],"("),[Concl],")")-2)
  >> AS Expr1
  >> FROM YourTable
  >> WHERE (((Concl) Like "*(*)*"));
  >>
  >> you can do it like this:
  >> UPDATE YourTable SET YourTable.fldSelection =
  >> Mid([Concl],InStr(1,[Concl],"(")+1,InStr(InStr(1,[Concl],"("),[Concl],")")-2)
  >> WHERE (((YourTable.Concl) Like "*(*)*"));
  >>
  >> On Wed, Dec 9, 2009 at 8:13 AM, Pedro Janssen <pedro at plex.nl> wrote:
  >>> Dear Group,
  >>>
  >>> is it possible to filter out text between ( ) in a field [Concl] and
  >>> place only the text between ( ) in a new field [fldSelection], with a query.
  >>>
  >>> Thanks
  >>>
  >>> Pedro


More information about the AccessD mailing list