This is somewhat experimental.
The purpose of it was to develop Remedy-Based Web-Applications with as little Client Requirements as possible.
(for example, you need the JRE or some kind of Java VirtualMachine to run Remedy Mid-Tier in your Browser)
Currently the generated Applications uses some JavaScript to get MidTier functionality.
But don't expect full featured Remedy-Applications running in ASP-Pages !
There is still a LOT to do, some features aren't implemented, others might be buggy.....

You need Microsoft Visual Studio (I use 2003) to compile the generated Code (dont't tested with Borland C#-Builder)
Download Small HowTo
If you want to start your own Projects (C#, Visual Basic) you can use the provided ARSWrapper.dll to access the Remedy API with .NET.
To use the wrapper in you projects, simply add the dll by AddReference, then create a variable in your class of type ARSWrapper.Class1
(something like public ARSWrapper.Class1 ars; )
You can download the DLL separately here.

Below is a small overview of the functions, that the wrapper currently provides. The functions may change in future releases, and new functions will probably added.
int Connect(String *server, String *user, String *password, int port)
Connects to a Remedy Server, you must provide the servername, username, password and TCP-Port (if you haven't set a Port, use 0)
Return : 1 = SUCCESS, 0 = FAIL

int Disconnect()

Terminates the connection to the Server.
Return : 1 = SUCCESS, 0 = FAIL

void CleanUp()

Frees resources internally used by the class (will probably removed in future releases)

String *GetARError()

Returns the last Error-Message from the ARSystem (complete ARStatusList as one string)

int ReadSchemas()

Reads all Schemas from the Server.
Return : Count of schemas, 0 = FAIL

String *GetSchema(int index)

Gets the name of the Schema at position index (from 0 to up to the return-value of ReadSchemas() )
Returns an empty string, if index is out of bounds.

int ReadFields(String *schema)
Reads the fields for the specified Schema.
Return : Count of Fields, 0 = FAIL

String *GetFieldName(int index)
Returns the database name of the field at position index (from 0 up to the return-value of ReadFields() )
Return an empty string, if index is out of bounds.

int GetFieldDataType(String *fieldName)

Returns the datatype of the specified field (AR_DATA_TYPE_XXXX) 0 = FAIL (field not found)

int PerformQuery(String *schema, String *qualifier)

Performs a search on the specified Schema using the specified qualifier. The qualifier-string must be a valid qualifier as used in the UserTool.
Return : Count of found Entries, -1 = FAIL

int PerformQuery(String *schema, String *qualifier, int maxRetrieve)

Same as the previous function, but you can narrow down the number of retrieved entries.

int PerformQuerySQL(String *command)

Performs a query based on an SQL-command.
Return : Count of found entries, -1 = FAIL

int NextEntry()
Reads the next entry from the performed query.
Return : 1 = SUCCESS, 2 = Last Entry reached, 0 = FAIL
You usually loop through the entries like this : do { ...some code.... } while (NextEntry == 1)

String *GetField(String *fieldName)

Returns the value of the specified field from the current entry.
Returns an empty string, if field is not found.
If the specified field is an Attachment Pool, the returned string is a concatenated list of the names of the Attachmentfields, separated by tildes (~).
Date-Format : DD.MM.YYYY, Time-Format : HH:MM:SS

String *GetFieldSQL(int column)

Returns data from the specified column after an successful call to PerformQuerySQL()

int SetField(String *fieldName, String *value)

Sets the specified field to the specified value.
For DateTime-Fields provide the following format : DD.MM.YYYY HH:MM:SS, for Date-only and Time-only fields specify only that part of the format.

int SaveAttachment(String *entryID, String *fieldName, String *fileName)

Saves the Attachment from the specified Entry and Attachmentfield to disk under the given filename.
Return : 1 = SUCCESS, 0 = FAIL

int SetAttachment(String *schemaName, String* requestID, String *fieldName, String *filename)
Writes an Attachment to the specified schema, field and request. Provide the full path and filename to the file to attach.
Return : 1 = SUCCEED, 0 = FAIL

int UpdateEntry(String *entryID)

Saves a modifed entry back to the database.
Return : 1 = SUCCEED, 0 = FAIL

int BeginNewEntry(String *schema, int numFields)

Call this function to begin a new Entry.
Specify the name of the Schema and the number of fields you want to set. Then call SetField() for each field to provide some data.

String *CreateEntry()
Writes the new entry to the database.
Return : The ReqestID for the created entry, or the string "NULL", in case of an error.

String *ProcessCommand(String *command)
This function wraps the API-function ARExecuteProcess.
It returns the result when the call was successful and an empty string, when the call fails.

unsigned int DateStringToTimestamp(String *timeStr, unsigned int format)
Converts a DateTime-String into a timestamp (seconds since 01.01.1970 00:00:00)
For the format of the string, see SetField()
format is one of the predefined values AR_DVAL_DATETIME_BOTH, AR_DVAL_DATETIME_DATE or AR_DVAL_DATETIME_TIME

String *TimestampToDateString(unsigned int stamp, unsigned int format)
The opposite of the previous function, returns a DateTime string from a timestamp.
In case of an Error, the Date is returned as "01.01.1970", the time is returned as "00:00:00"

String *TimestampToDateString(String *stamp, unsigned int format)
Same as the previous function, but you provide the timstamp as a string.

int DateStringToJulian(String *date)
This function wraps the function ARDateToJulianDate.
You provide a timestring in a format described in SetField().

String *JulianToDateString(int julian)

This function wraps the API-function ARJulianDateToDate.
The return-value is a date-string in the format DD.MM.YYYY

String *JulianToDateString(String *julian)
Same as the previous function, but you provide the julian-date as a string.