Teststand open database step type modification using DotNet

Dear all,
I am currently looking at ways to change the default means by which TestStand manages database connections and operations to a SQL database. By default, TestStand uses Oledb to connect to any database. However, I would like to use .Net class sqlconnection to open/close and manage connections because of its performance advantage over Oledb. 
I have been looking at the provided source code for the database step types (written in CVI) and also researching on how to appropriately call managed code/methods (.Net C#) into unmanaged code (CVI). I would like to (ideally) be able to open a connection via Class Sqlconnection(from .Net), somehow maintain the instance of the class created, and close the connection when the appropriate operations are complete. Marshalling the required object is not possible between managed and unmanaged codes (CVI is not object oriented?) so i would like to find an alternative means of maybe creating a handle for the class and keeping it alive in memory until i manually free it. 
Should i be looking also at the DotNet wrappers that come with test stand? any suggestion on a better way of doing this? 
I may be totally heading in the wrong direction so any guidance would be most appreciated.
Thank you 

Dear John,
Thank you very much for your prompt and helpful reply.
Our company is a custom automation solutions provider and we are tailoring a medical test application for a client in the medical field. We are integrating biometrics identification and authentication into our solution in order to be 21 CFR Part 11 compliant. Part of the compliance means that there cannot be any clear text username/password used in any part of our solution.
So what we hope to do is to change the default process model of test stand to restrict what it can and cannot do. We would like to prevent the test stand sequence writers (our client will write their own test sequences) to have any means of bypassing biometric authentication (i.e via username/password). This means we would either need to completely remove test stand's current open/close connection step types (and rewrite our own in .Net), or, modify the current implementation of test stand database step types (as per my previous post description).
.Net sqlconnection class provides the necessary option of using windows identification to open a sql connection. It also (by my understanding) executes 2.5 times faster compared to Oledb connections.  
We are an Alliance member and our Alliance coordinator is Jeremy Taylor. I am posting on this developer forum to gain input from anyone who might have experience in this area and for whoever who will be doing similar projects to ours in the future. 
Thank you for your time.

Similar Messages

  • Photoshop CS6 (Mac) crashes when opening files with type or using the type tool

    Hi,
    Photoshop CS6 keeps crashing when using the type tool or when opening files with type on it. I've quit suitcase, disabled the suitcase plug-in, reset the preferences in Photoshop there's no crash report coming up either the application just dies! I am currently trying a system restore from time machine to see if that works!. Any other suggestions would be greatly appreciated.
    Many thanks
    Olly

    http://blogs.adobe.com/crawlspace/2012/07/photoshop-basic-troubleshooting-steps-to-fix-mos t-issues.html
    http://helpx.adobe.com/photoshop/kb/troubleshoot-fonts-photoshop-cs5.html

  • TestStand Open SQL Statement does not support SQL's ORDER BY clause???

    TestStand 1.0.3
    Windows 2000 SP1
    SQL Server 2000 Personal
    You've got to be kidding me...
    It appears that the built-in TestStand Open SQL Step does NOT support the
    "ORDER BY" clause in the SELECT statement, even though the documentation
    says it does. Is this true?
    I have an Open SQL Statement query:
    "SELECT * FROM [MyTable] WHERE ([Batch ID]=1234)"
    it works fine, returning a correct record count 120 records. If I change
    the Open SQL Statement query simply by adding an ORDER BY clause, such as:
    "SELECT * FROM [MyTable] WHERE ([Batch ID]=1234) ORDER BY [MyField] ASC"
    it returns a record count of zero. I know that "MyField" exists in the
    MyTable table and contains valid data. The
    second query works fine in SQL
    Server Enterprise Manager.
    Am I missing something? Is it true that the TestStand Open SQL Step does
    NOT support the "ORDER BY" clause? If not, what &#$!ing good is it and why
    does the manual state it is supported? Is there any other way using just
    the TestStand steps to order a database recordset on one or more fields?
    Any help would be appreciated.
    Grrrrr....
    Bob Rafuse
    Etec Inc.

    > Bob -
    > The database step types do not do anything special to the SQL command
    > that you give it. The step just passes the command to the ADO
    > provider. I tried a simple query using the step types with the
    > following command,
    >
    > "SELECT UUT_RESULT.* FROM UUT_RESULT WHERE ([UUT_SERIAL_NUMBER] =
    > 12345) ORDER BY [EXECUTION_TIME] ASC"
    >
    > and this return the expected results and the record count parameter
    > was as expected. I tried this on TS 1.0.2 and TS 2.0 with MS Access
    > 2000 and MS SQL Server 7.0. I do not have MS SQL Server 2000 at this
    > time.
    >
    > It would be surprised if the step types are messing something up.
    I've been doing some experimenting over the past couple of days. Simple,
    one-table queries seem to handle the ORDER BY clause fine. Th
    ings seem to
    get messed up when I try multi-table queries with ORDER BY clause with the
    TestStand database steps. I get no errors but the returned record counts
    are always 0 with the ORDER BY and positive without the ORDER BY. The exact
    same queries work fine in Visual Basic/ADO and the SQL Server Query
    Analyzer.
    > Questions:
    > 1. Have you verified whether the data is actually returned even though
    > the record count is zero?
    Hmmm... yes data IS getting returned (at least on the two instances I just
    checked), but the record count is always zero. I was not proceeding with
    processing if the record count was 0.
    Still... I don't know how to loop through the recordset without knowing how
    many records there are an not eventually generate an error by passing EOF.
    Is there another way using the TestStand database steps to determine a) the
    number of records in the recordset or b) when I'm at EOF?
    > 2. Are you using any advanced options on the Opend SQL Statement step
    > type, specifically
    the cursor type set to forward only? Forward only
    > cursors do not allow for record counts.
    Everything on the Advanced tab of the Open SQL Statement step is set to "Use
    Default".
    Bob.

  • Problems with upgrading interfaces of custom step types

    This question is about configuration management of custom step types.
    Here at Cummins, we have defined our own custom step types (CSTs) using MyTypes.ini. People all over the company use these CSTs in their seq files.
    All these CSTs are calls to individual sequences in a seq file (for simplicity, we'll call this file "Source.seq"). An example CST would be MyStep which calls the sequence MyStep_sequence in the file Source.seq.
    What we want to do going forward is: add one more parameter to the interface of this CST. That means, we will add one more parameter to the sequence MyStep_sequence and then upgrade the definition of the step in MyTypes.ini. We don't want to break existing users, and want the future users of this CST to be able to use this new parameter for newer functionality (ofcourse I did think about creating a new CST all together, but that seemed more maintenance in the future).
    In order to achieve this, my idea was to check mark the box "Use Default" in MyTypes.ini for the new parameter (I propose this because very few of the new users will want to care about this new parameter). At the same time, increment the version number of the step. So now, when an old file is brought up that was using this step, it should be usable just as is without any modifications (ofcourse it will need to be re-saved). When this step is used now by a new person, he will be able to see the new parameter and either not care about it (leave it checked as "Use Default") or pass a desired input to it.
    First question :, does this sound like a good long term approach for maintaining backward compatibility and CM control? Or are there any percieved issues with doing this due to which its recommended to just go ahead and create a new step?
    Second question: this seems to work only if the new parameter is added as a the last parameter in the sequence. if I move things around, (for ex: make this new parameter the first parameter of the sequence), it seems to mess things up. I am okay with making the new interface parameter the last one, but just wanted to throw out this observation I made and see if people had any comments..
    Third question: to make things a little more complex, some of the other sequences in Source.seq also USE MyStep. But I've realized that the only implication this has is, I'll have to open up Source.seq and re-save it beofore I send it out to the users..?

    Hi Anuj,
    Answer 1: Yes, this is a good long term approach in regard to compatibility, maintenance, and control.
    Answer 2: Yes, as of TestStand 4.0 this is expected behavior, as the programmatic reordering of prototypes is not a supported code generation teqnique.
    Answer 3: In short, yes you much open and save every sequence that contains your new CST. Be sure to save your step type first, making sure to increment your version number. This method will ensure that the step type conflict is automatically resolved in files that load this new type. If you forget to increment your version number you will have to manually resolve this conflict.
    Thanks
    Evan Prothro
    RF Systems Engineer | NI

  • Update Step Types

    Hi,
    I want to add a property and a pre-step to the NumericLimitTest step type.
    I have already developped some sequence files and I want to update them easily.
    How can I do that ? (I use TestStand 3.1)
    Bruno

    Hi,
    The best way would be to make a copy of the NI NumericLimitTest step type. When you try to edit the NI NumericLimitTest step type it forces you to create a copy (unless of course you have the 'Allow Editing of NI Installed Types' enabled in the Sequence Editor Options, I wouldn't advise doing this). If this has been enabled then you would be able to do what you like the the installed step types.
    Once you have you own version of the NumericLimitTest step type.
    Make your changes to it. Once you are happy with the changes.
    Open your SequenceFile and use the Replace tool in the Edit menu to change the steps using the NI NumericLimitTest step type to use your version. You will then have to edit each of the steps in your sequencefile to change the new properties, you have added, from any default values to actual values.
    Hope this helps
    Regards
    Ray Farmer
    Regards
    Ray Farmer

  • Custom step types and custom step data.

    Hello.
    I have a good understanding of how TestStand allows custom step types to allow users to store custom data.
    I have also read numerous posts about users asking for the ability to store some custom data associated with steps.
    In my scenario I am required to write a sequence using a few third party supplied step types.
    To assist in developing and debugging this sequence, we would like to store a container of custom data with each steps.
    Option 1: Create custom step types.
    This is really not an option, relying on third party step types. Any customization made to their step types will magically disappear, along with any custom data, the next time I install one of them service packs.
    You may argue that I just have to ensure all custom fields are recreated before opening a sequence file. This works in my office when everyone is at edge with this, but in a few months someone will "take responsibility"
    and upgrade the 3rd party packs without reading the entire upgrade procedure.
    Option 2: Create links in Sequence Locals
    This does work, but is not very associative. To work, the name of the Locals entry would need to be the unique ID of the step it refers to.
    Also, it requires some more maintenance to insert new steps, and to remove stale references.
    I really hope that someone in TestStand R&D reads this, and enables users to store step custom data, for example by adding a "CustomData" container to the TS property of the step.
    Regards,
    Ivar S.

    Ray:
    Thanks for answering.
    I am aware that I can extend a custom step type by creating a new step type based on the first type.
    For example, I have this 3rd party JtagExecuteTest step type, supplied by another solution vendor.
    In my sequence, I want a custom error & failure handler, that needs information about each step as they fail.
    For handling and logging purposes, I need each step in my sequence to carry information in addition to the setup required by JtagExecuteTest.
    So I set forth, and modify the step type JtagExecuteTest step, along with some other 10-15 step types that the other solution vendor has put in their package.
    This works like a charm until I have to reinstall or upgrade the package.
    Because I modified the steps using their original name, all data I put into the steps are lost.
    Next attempt, I follow your advice and create MyJtagExecuteTest step, based on the original steps. Again, I repeat this customization for 10-15 step types.
    This works like a charm until I have to upgrade the package.
    Now some wise guy at the other solution vendor has renamed a DLL or a function call, breaking down every step that I have customized.
    Mush better, though, because I can repeat the customization process and the data does not disappear.
    Still, this is just too much hassle just to put TestStand to some decent use.
    If I could just click on a step, add my custom properties, and have TestStand retain those data as a user customization that particular step instance.
    Much like you have Sequence.Locals, it would be extremely useful to have a Step.Locals container for the users to use at will.
    Regards,
    Ivar Svendsen.

  • Assignment of Step type and CR step for MDG_S

    Hi
    This is in continuaton for thread MDG_S workflow.
    I original issue which is for MDGS when I assigned WS543000005 to CR type and sumitted CR goes no where,
    As as per SWEL it  shows No Reciver Found enen though GET_AGENT table is maintained.
    In another system I found that WS531000044 is assigned ti CR Type Then I tested it and found that CR creates Work Items also upto final processing.
    as per below
    Before CR Submission : CR status is 02: Changes to be executed
    After CR Submission : CR status is 01:To be considered and Approved
    After CR Reviewer approves : CR status is 09: Dependant Data to be processed /Approved
    After Purchase reviewer Finalize processing :CR status is 09: Dependant Data to be processed /Approved
    After Finainace reviewer Finalixe processing :CR status is 09: Dependant Data to be processed /Approved
    Now I can not see CR any where even though CR step 04 and 04 assigned to my user ID
    I have some questions as Description in Define Change Request Steps is not Mataching with description in GET_AGENT desesion table.
    Also it is observed that step 80 is not assigned to WS531000044 in IMG node Define Change Request Steps but it can be seen in GET_AGENT decesion table and step no 06 and 07 does not appears in GET_AGENT decesion table ( In edit mode).
    Can you explain from where assignment of  CR steps to CR type in desion table are taken ino accout ?
    Why description is not matched for steps under IMG and in decesion table?
    Can you explain me releationship between CR step and step type,CR Status and where they \maintained in IMG and how proceeses modelling is diffenent t for determination of Next CR step in case of WS531000044 ?

    Please keep in mind that "hard-wired" workflow templates are just that: hard-wired. This means that a specific workflow template (for example WS53100044) will always have the same number of steps, each step will always have the same type and number, agents will always be assigned in the same way, and those can't be altered by configurations. To understand each workflow template's behavior, you can either open that template in transaction PFTC or SWDD, or alternatively, read the exact behavior in SAP Help documentation. You basically need to google the workflow template number and you should be able to find the description of each template's behavior (by the way, the number you type has an extra zero so if you can't find a match on Google, you will know why ).
    Now, the assignment of CR steps to CR type is done in the workflow template itself and NOT in the decision table. See the first screenshot:
    The step number above "should" correspond to what is in the configuration table (for readability and consistency of documentation purposes). However, if for some reason, it does not, the hard-coded value is the value that will actually be considered. So, in technical terms, the assignment of step numbers in MDGIMG has no influence on how the workflow template will behave. Again, the main purpose is for the corresponding description in the step number configuration table to show on the CR window.
    The other thing is the step type. A step type purpose is mainly to indicate what set of buttons will show at the top of the CR window. The fact that step types are represented by numbers confuse a lot of people with step numbers. I would have personally preferred if step types were a 2-char field so that a clear distinction can be made between step types and step numbers. In any case, buttons on the CR correspond to actions and you can see in MDGIMG that you can assign step types to actions. SAP delivers a pre-defined set of step types and associated actions. Those must NOT be altered because they could break the standard workflow templates. However, you can create your own custom step types and link them with as many actions (standard or custom actions) as you like. But again, you can't assign those custom step types to hard-wired workflow templates. You can only use them in your custom workflow templates or in the rule-based workflow.
    Now, the question is how does the hard-wired workflow know what step type to use. The answer is easy: you can either find that in the SAP Help documentation or in the workflow template definition in transaction SWDD. For the above screenshot, the step type is 2. You can find that if you double-click the task ID TS75707980 (or display it using transaction PFTC) and look in the "Cntainer" tab. In this case, this task will ALWAYS have type 2. Other tasks are assigned different step types or are more dynamic in the sense that they expect the step type to be passed from the main workflow template calling them. For example TS53200002 will always have type 7, TS60808005 will always have type 5, and TS60807954 accepts the step type dynamically. This last one is the one used in the rule-based workflow (hence it has to read the step type configured in the decision table).
    I hope this answers you question. You definitely need some level of workflow design/build knowledge in order to be able to completely understand all of this. Hopefully, this gives you a good starting point.

  • Step Type Menu Distribution. How to?

    Hi,
    I created at one of my develpopment station with TestStand the custom: Step Type Menu.
    How i can to distribute that - Step Type Menu to others stations (e.g. which file concludes it)?
    Thank you & Best Regards
    *I use LabVIEW 8.X & TestStand 3.5/4.0.1 versions only

    If you have created your own Type Palette. The file will be stored in TestStand 3.5\Components\User\Type Palettes, the name of the file will be the name of your Type Palette, e.g. MyTypes.ini
    Regards
    Steve
    There are 10 types of people in the world that understand binary, those that do and those that don't.

  • Weird step type menu behaviour

    I am having problems getting a menu item to show up in the step type menu using the menu configuration tool, even though it is shown as unhidden.  I attached an image.  What could be wrong here?  I restarted teststand also.
    Attachments:
    step type menu.jpg ‏347 KB

    >
    It looks like that group is empty.  TestStand will not display empty groups.
    Well, I swear the step was inside the folder just prior to taking that screenshot, because I couldn't get at the step type I deposited in the folder because it was hidden (my first indication of a problem).  I then moved it back out so I could see it and use it, then I took the shot.  I should have taken the screen shot prior, because now I cannot reproduce the issue.  I moved the step back into the folder and it showed up.  So chalk it up to quirky behavior.
    Thanks
    Message Edited by david_jenkinson on 09-12-2007 11:07 AM

  • Can not open Database

    HI,
    When I try to open the database it gives an error message
    ORA 604, Cannot open database.
    I am using Personal Oracle 8. What should i do now to open the database.
    Thanks in Advance
    - Muks

    check the path of init.ora.
    find the svrmgr*.exe file.
    run it.
    connect as internal or sys.
    and then
    write : startup pfile = <path of init.ora>\<init.ora>
    null

  • I need to pass data from an Access database to Teststand by using the built in Data step types(open data

    base /open SQL Statement etc) the first time i defined the system everything was fine but when i changed the Database (using M.S.Access) the " open SQL Statement" it would show the tables but not thier columns ,I"m using win98 sec edition / Teststand 1.0.1i need to pass data from an Access database to Teststand by using the built in Data step types(open database /open SQL Statement etc) the first time i defined the system everything was fine but when i changed the Database (using M.S.Access) the " open SQL Statement" it would show the tables but not thier columns ,I"m using win98 sec edition / Teststand 1.0.1
    When I tried the same thing on another cmputer the same thing
    happend
    appreiciate u"r help

    base /open SQL Statement etc) the first time i defined the system everything was fine but when i changed the Database (using M.S.Access) the " open SQL Statement" it would show the tables but not thier columns ,I"m using win98 sec edition / Teststand 1.0.1Hello Kitty -
    Certainly it is unusual that you can still see the tables available in your MS Access database but cannot see the columns? I am assuming you are configuring an Open Statement step and are trying to use the ring-control to select columns from your table?
    Can you tell me more about the changes you made to your file when you 'changed' it with MS Access? What version of Access are you using? What happens if you try and manually type in an 'Open Statement Dialog's SQL string such as...
    "SELECT UUT_RESULT.TEST_SOCKET_INDEX, UUT_RESULT.UUT_STATUS, UUT_RESULT.START_DATE_TIME FROM UUT_RESULT"
    Is it able to find the columns even if it can't display them? I am worried that maybe you are using a version of MS Access that is too new for the version of TestSt
    and you are running. Has anything else changed aside from the file you are editing?
    Regards,
    -Elaine R.
    National Instruments
    http://www.ni.com/ask

  • Know steps names of called sequence file using sequence call step type in TestStand

    Hi,
        I have a problem in accessing step names in called sequence file using "Sequence call"step type in TestStand 4.0.
    I would list out all step names of called sequence file. Is it possible to do through C#.NET? If, yes, Please explain to me in detail with possible example.
    Thank you,
    regards
    RKK

    Hey RKK,
    I want to first set your expectations for the forums.  This is not a place for people to review and rewrite your code for you; this is a place for specific and general questions.  I am not saying your question in this thread is inappropriate, because it is a good questions.  We should just not post code and ask others to fix it here.  If you are looking for this type of service we have alliance members that can help you write your TestStand Operator Interface (www.ni.com/alliance).
    As for you question about getting the sequence names for a sequence file that is not the currently running sequence file, you will need to open a reference to that sequence files and then use the API calls that I mentioned in my previous posts.  You can use the Enigine.GetSequenceFileEx function to open a reference to sequence file, and you will need to close the reference with the Engine.ReleaseSequenceFile function when you are done using it.  After you have a reference to this external Sequence File, you can use the example dll and sequence I previously sent you.  I also attach a new sequence file (SeqFile2.seq) plus an updated GetNames.seq to illustrate how to use the above mentioned functions.  I hope this helps.  Have a great day!
    Best Regards,
    Software Engineer
    Jett R
    Attachments:
    GetNamesOfSequencesInFile.zip ‏52 KB

  • Insert a specified built-in or custom step type in Teststand using CVI

      I try to build a step type . this step type specifies an adapter of DLL, which is developed under CVI. I want to use Teststand API functions in CVI to fulfill the following functions.
      1, insert a specified built-in or custom step type into current sequence;
      2, insert a specified built-in or custom step type into another sequence.
    Thanks!
    Jacky

    Hi Jacky,
    There is an example program called Programmatically Inserting a Step into a TestStand Sequence Using LabWindows/CVI and a KnowledgeBase called Programmatically Inserting a New Step in the Currently Executing Sequence that should answer your question.
    Hope this helps!
    Best Regards,
    Jonathan N.
    National Instruments

  • Step Type Problems with TestStand 3.5

    I have a TestStand system where I have created some custom step types (Created originally in TestStand 2.0). I've
    used these step types successfully in TestStand 3.1 projects with no problems.
    With TestStand 3.5 I have a recurring problem that I cannot clear.
    Once the custom steps have been added to the system, I re-load my Process model sequence files and resolve type
    conflicts by selecting currently loaded types. (Since my process model utilises these steps and was developed under
    3.1)
    I save the Process Model and then load in my test programs, again resolving type conflicts by selecting currently
    loaded types.
    So far so good.
    However, when I exit the sequence editor I'm ALWAYS being prompted that the NI_FlowControl.ini typepalette file has
    been changed.
    This happens even when I set the system to have NO Process Model selected and don't load a program! i.e. I open the
    sequence editor and shut it down immediately.
    1. Why isn't the Sequence editor prompting me that it's about to change the typepalette file?
    2. Why is it changing the type? (And at what point is it happening?)
    3. I have no indication as to what has changed within the type and where the conflict is coming from.
    4. Why is saving the type having no effect whatsoever?
    At one point with a configuration it kept telling me that the NI_DatabaseTypes.ini file had changed (and that it was
    the only one to change) I experimented by removing that type palette entry (since I didn't use the database steps
    with my process model) and it then started complaining about one of the other NI types as being changed! (Is this a
    TestStand bug?) or is there a decent explanation?
    I've even tried redefining the typepalette files of my step types to create a clean system, but it all falls apart
    whenever I try and load an existing test program. No matter how careful I am, TestStand insists on changing loaded
    types without telling me or giving me the option to choose what I want to do!! (Note - re-writing the test programs
    is NOT an option!)
    Any ideas would be welcomed....  

    Brian,
    Have you modified the CommonResults data type?  What is the version that you have loaded?  I have seen this problem when you have a newer version of a data type than the engine loads on startup.  You can fix this problem by either reverting back to an older version of that type (the same as the engine version), or using the following workaround:
    In TestStand, open your type palette window. In the Palette pull down ring select "Customize". Create a new type palette and make sure it is the top-most palette in the list. Name it whatever you like. Click "Ok". Now select your NI_DatabaseTypes.ini from the pull down. Go to the "Standard Data Types" tab, select the "CommonResults" type and copy it.
    Select your newly created type palette from the pull down, and paste the "CommonResults" type into this palette. Save all of your palettes.
    You should no longer be prompted to save your type palettes unless an actual change has been made.

  • Add-on step types for TestStand?

    I am almost certainly reinventing some wheels with Teststand by creating some basic test types.
    For example, I just wrote a custom step type for taking an analog measurement from a DAQmx instrument. Surely someone has done this before, and surely someone will want to do it again. There's nothing proprietary about code that simple, and I'd be happy to give it away if there was a place to post it.
    Two questions:
    1. Is there an open-source repository for sharing custom step types?
    2. Are there add-ons for purchase with canned step types beyond those which come with TestStand?
    -Arthur

    Hi Jigg, 
    I looked at Averna.com, and I don't see any add-ins available on their website. It looks like they offer services mostly. 
    It's a good point about TS projects being so varied and customized. However, if custom step types are well architected, as the built-in step types are, then they ought to be reusable by others. 
    You're right also that I can accomplish my DAQmx steps easily using an Action step with the LV adapter. My motivation for the custom step is to improve the interface for setting up such an action. In particular, when using an IO channel in TS, I have to manually type in a text string for the DeviceName value, whereas I'd like to choose from a list of global names (e.g. with the global channel list control in LV). I can get this affect by using an Enum in a wrapper VI, which maps to an array of channel constants; but this is fragile if the available channels are changed (e.g. added, removed or renamed in MAX).
    Additionally, a custom step type is better than a step template for my purposes, because I can propagate changes in the step type to instances of steps throughout the test. This is incredibly valuable to me during development and debugging. It saves me time when I want to update a step that I've used many times throughout a test sequence. Although TS isn't itself a programming language, I find that I expect it to share certain traits with programming languages to facilitate development, such as type abstractions and a strict enforcement of congruency between types and instances. But I digress....
    Thanks for your suggestions.

Maybe you are looking for