Using Basic Search Syntax Example (C#)
This example shows how to search the vault for file and
folder card variables using CreateSearch2 search syntax.
NOTE: If using the primary interop assembly
provided with SOLIDWORKS PDM Professional, see
Using .NET Framework 4.0 in
Stand-alone Applications.
//----------------------------------------------------------------------------
// Preconditions:
// 1. Start Microsoft Visual Studio.
// a. Click File > New > Project > Visual C# >
Console Application.
// b. Type Search in Name.
// c. Click Browse and navigate to the folder where to
create the project.
// d. Click OK.
// e. Click Show All Files in the Solution Explorer
toolbar and expand
// Program.cs in the Solution Explorer.
// f. Replace the code in Program.cs
with this code.
// 2. Add EPDM.Interop.epdm.dll as a reference (right-click
the project
// name in the Solution Explorer, click Add Reference,
click
// Assemblies > Framework in the left-side panel, browse to
the top folder of
// your SOLIDWORKS PDM Professional installation, locate and
select
// EPDM.Interop.epdm.dll, click Open, click Add,
and click Close).
// 3. Change the vault name and the vault view path
in the code.
// 4.
Make sure
your vault contains a text file data card with a Document Number data card variable,
// and checked-in files with data card values exactly as described in the code.
// 5. Click Debug > Start Debugging or press F5.
//
// Postconditions: Press a key when prompted in the console.
//----------------------------------------------------------------------------
//Program.cs
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
using
EPDM.Interop.epdm;
namespace
ConsoleApp1
{
class
Program
{
static
void Main(string[]
args)
{
Console.WriteLine("Press
a key...");
Console.ReadKey();
IEdmVault21 CurrentVault =
new
EdmVault5()
as
IEdmVault21;
CurrentVault.LoginAuto("JEB5",
0);
// The vault contains these
files:
The file data cards contain these variables and values:
// DocNum=five-six-seven
Comnt=ijk.txt
@Document Number=567 & @Comment=ijk
// DocNum=five-six-seven
Comnt=xyz.txt
@Document Number=567 & @Comment=xyz
//
DocNum=one-two-three Comnt=abc.txt
@Document Number=123 & @Comment=abc
IEdmSearchResult5 _searchResult;
IEdmSearch9 _search = (IEdmSearch9)CurrentVault.CreateSearch2();
// Let's see whether the
IEdmSearch9 object _search works - just as an example; not needed in common
practice
string[] VarNames0 = { };
_search.AddMultiVariableCondition(VarNames0,
"@:");
// poVariableNames can be null
_search.GetFirstResult();
bool OriginatedFromCreateSearch2 =
_search.GetSyntaxErrors() !=
null;
Console.WriteLine("OriginatedFromCreateSearch2
= " + OriginatedFromCreateSearch2);
Console.WriteLine("Press
a key...");
Console.ReadKey();
for (int i = 0; i < 7; i++)
{
bool ExceptionEncountered =
false;
_search.Clear();
_search.StartFolderID = CurrentVault.GetFolderFromPath("C:\\Users\\J4M\\Desktop\\JEB5").ID;
switch (i)
{
case
0:
// Single variable search
conditions
// Expressions for special criteria and variables
// Finds DocNum=five-six-seven Comnt=xyz.txt
Console.WriteLine("");
Console.WriteLine("Expressions
for special criteria and variables:");
_search.FileName =
"(limit | cam) !wheel OR DocNum";
_search.AddVariable2("Document
Number",
"56 & 7");
_search.AddVariable2("Comment",
"xy | z NOT a");
break;
case
1:
// Multi-variable condition
with extended possibilities for variable names
Console.WriteLine("");
Console.WriteLine("A
multi-variable condition with extended possibilities for names:");
{
string[]
VarNames = {
"\"Document Number\"",
// Variable name contains a space so it must be quoted; quotes must be escaped
with backslashes
"Comment",
// Extra quotes are not
required for simple names
"51",
// Database ID of Project name is a numeric constant
"_Name"
// _Name represents
file/folder name
};
// xy and z should be in one and the same variable value - owing to {}
// Text 567 can be present in a different variable of a searched document
// Because 567 and {z xy} can be in different variable values of the same
document (and here we want to find such cases),
// apply : at the beginning of
the condition to turn on multi-value search logic
// Finds DocNum=five-six-seven Comnt=xyz.txt
_search.AddMultiVariableCondition(VarNames,
":567 {z xy}");
}
break;
case
2:
// Multi-variable condition for
all vault variables plus file/folder name
Console.WriteLine("");
Console.WriteLine("A
multi-variable condition for all vault variables:");
{
string[]
VarNames = {
"\"\"",
// "" represents any vault
variable (and so does numeric constant 0)
"_Name"
// Unquoted _Name represents
file/folder name
};
// Finds DocNum=five-six-seven Comnt=xyz.txt
_search.AddMultiVariableCondition(VarNames,
":567 xyz | five xy");
}
break;
case
3:
// Multi-variable condition
with mistakenly unquoted names
Console.WriteLine("");
Console.WriteLine("A
multi-variable condition with mistakenly unquoted names:");
try
{
string[]
VarNames = {
"Document Number",
"Comment",
"Project Name"
};
//
Causes an exception because there are unquoted names with spaces
_search.AddMultiVariableCondition(VarNames,
":567 xyz | five xy");
}
catch (System.ArgumentException ex)
{
Console.WriteLine("Wrong
variable name syntax... HRESULT = 0x" + ex.HResult.ToString("X")
+ ex.Message);
ExceptionEncountered =
true;
}
break;
case
4:
// Syntax errors are not
displayed and no documents are returned
Console.WriteLine("");
Console.WriteLine("Non-displayed
syntax errors:");
_search.FileName =
"(limit = | cam) !wheel OR AND DocNum";
_search.AddVariable2("Document
Number",
"56 && 7");
_search.AddVariable2("Comment",
"xy | z() NOT a");
break;
case
5:
// Syntax errors are displayed
(because @: is at the beginning of the conditions) and no documents are returned
Console.WriteLine("");
Console.WriteLine("Messages
about syntax errors:");
_search.FileName =
"@:(limit = | cam) !wheel OR AND DocNum";
_search.AddVariable2("Document
Number",
"56 && 7");
_search.AddVariable2("Comment",
"@:xy | z() NOT a");
break;
case
6:
// Multi-value syntax with
error reporting (because @: is at the beginning of the condition)
Console.WriteLine("");
Console.WriteLine("Advanced
syntax features:");
// The first argument, VarNames0, can be null because all the variables used are
defined directly inside the second argument (condition)
// The second argument specifies to look for files that have (Comment = abc and
any card variable containing xyz) OR (file name or "Document Number" containing
123 or ab, but not five)
// @: turns on multi-value logic at the top level of a condition (as does just a
colon)
// @: allows variable bindings
// Finds DocNum=one-two-three Comnt=abc.txt
_search.AddMultiVariableCondition(VarNames0,
"@: @Comment=abc & @\"\"(xyz) | @(\"Document Number\" | _Name)(123 | ab &
!five)");
break;
}
if (ExceptionEncountered)
_searchResult =
null;
else
_searchResult = _search.GetFirstResult();
if (_searchResult ==
null)
Console.WriteLine("Returned
null...");
else
Console.WriteLine("Returned
a file list...");
Console.WriteLine("Press
a key...");
Console.ReadKey();
if (_searchResult !=
null)
{
while
(_searchResult !=
null)
{
Console.WriteLine("NAME
= " + _searchResult.Name +
", PATH = "
+ _searchResult.Path);
Console.WriteLine("Press
a key...");
Console.ReadKey();
_searchResult = _search.GetNextResult();
}
}
else
{
string[]
SyntaxErrors = _search.GetSyntaxErrors();
if
(SyntaxErrors !=
null)
foreach
(string
s
in
SyntaxErrors)
{
Console.WriteLine(s);
Console.WriteLine("Press
a key...");
Console.ReadKey();
}
}
}
}
}
}
Back to top