Nu har dock AdkClose börjat strula. Fram till dess fungerar allt, men när jag kör AdkClose får jag AccessViolation Exception. Får se om jag får till det. Här är min kod iaf.
[EDIT]
Det är bara när jag lekt med fakturor (som har rader) som adkClose inte fungerar. Kanske är någon struktur jag missat att ta bort eller så. Om jag lägger till en faktura utan rader fungerar det felfritt
[/EDIT]
[EDIT]
Ytterligare uppdatering. Det är när jag försöker lägga till artikelrader som det blir fel. Om artikeln finns så läggs fakturan till, men AdkClose() kastar exception. Om artikeln inte finns får jag exception redan vid AdkAdd(). Det blir också fel om fakturan redan finns (AdkClose() kastar exception då).
Koden för att kontrollera om artikeln finns är exakt samma som jag använder för kunder, men där fungerar det alltid... Antagligen är det något jag missar att sätta eller ta bort... Ska ringa Visma imorrn och fråga om de kan veta vad det beror på.
[/EDIT]
// Öppna företag räkna ned användarlicenser
[DllImport("adk.dll", EntryPoint = "_AdkOpen@8", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkOpen(string sysPath, string ftgPath);
//Stäng företag räkna upp användarlicenser
[DllImport("adk.dll", EntryPoint = "_AdkClose@0", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int AdkClose();
// Skapa en struktur
[DllImport("adk.dll", EntryPoint = "_AdkCreateData@4", CharSet = CharSet.Ansi)]
public static extern int AdkCreateData(int IDataBaseId);
// Uppdatera
[DllImport("adk.dll", EntryPoint = "_AdkUpdate@4", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkUpdate(int pDb);
//Återställ struktur
[DllImport("adk.dll", EntryPoint = "_AdkResetStruct@4", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern ADKERROR AdkResetStruct(int pDb);
// Radera struktur
[DllImport("adk.dll", EntryPoint = "_AdkDeleteStruct@4", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkDeleteStruct(int pDb);
// Radera
[DllImport("adk.dll", EntryPoint = "_AdkDelete@4", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkDelete(int pDb);
// Radera rad
[DllImport("adk.dll", EntryPoint = "_AdkDeleteRow@8", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkDeleteRow(int pDb, int iIx);
// Skapa en datarad
[DllImport("adk.dll", EntryPoint = "_AdkCreateDataRow@8", CharSet = CharSet.Ansi)]
public static extern int AdkCreateDataRow(int IDataBaseId, int iNumber);
// Hämta en datarad
[DllImport("adk.dll", EntryPoint = "_AdkGetDataRow@8", CharSet = CharSet.Ansi)]
public static extern int AdkGetDataRow(int pDB, int iIndex);
// Ställ på första post i strukturen
[DllImport("adk.dll", EntryPoint = "_AdkFirst@4", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkFirst(int pDb);
// Nästa post
[DllImport("adk.dll", EntryPoint = "_AdkNext@4", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkNext(int pDb);
//Föregående post
[DllImport("adk.dll", EntryPoint = "_AdkPrevious@4", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkPrevious(int pDb);
//Ställ på sista post i strukturen
[DllImport("adk.dll", EntryPoint = "_AdkLast@4", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkLast(int pDb);
//Sök upp en post
[DllImport("adk.dll", EntryPoint = "_AdkFind@4", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkFind(int pDb);
// Lägg till
[DllImport("adk.dll", EntryPoint = "_AdkAdd@4", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern ADKERROR AdkAdd(int pDb);
// Hämta bool
[DllImport("adk.dll", EntryPoint = "_AdkGetBool@12", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkGetBool(int pDb, int iFieldID, ref int pbValue);
// Hämta double
[DllImport("adk.dll", EntryPoint = "_AdkGetDouble@12", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkGetDouble(int pDb, int iFieldID, ref double pdValue);
public static double SPCSGetDouble(int pDb, int iFieldID)
{
double res = 0;
SPCSTry(AdkGetDouble(pDb, iFieldID, ref res));
return res;
}
// Hämta sträng
[DllImport("adk.dll", EntryPoint = "_AdkGetStr@16", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkGetStr(int pDb, int iFieldID, ref string ppsValue, int iLen);
public static string SPCSGetStr(int pDb, int iFieldID)
{
string result = string.Empty;
SPCSTry(AdkGetStr(pDb, iFieldID, ref result, 256));
return result;
}
//Hämta datum
[DllImport("adk.dll", EntryPoint = "_AdkGetDate@12", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkGetDate(int pDb, int iFieldID, ref int pdaValue);
//Hämta data
[DllImport("adk.dll", EntryPoint = "_AdkGetData@16", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkGetData(int pDb, int iFieldID, int iIndex, ref int pDbRow);
//Hämta decimaler
[DllImport("adk.dll", EntryPoint = "_AdkGetDecimals@12", CharSet = CharSet.Ansi)]
public static extern ADKERROR AdkGetDecimals(int pDb, int iFieldID, ref int iDec);
//Hämta en feltext, behöver ev. vara unsafe
[DllImport("adk.dll", EntryPoint = "_AdkGetErrorText@16", CharSet = CharSet.Ansi)]
public static extern void AdkGetErrorText(ref ADKERROR err, int nErrorTextType, ref string achBuf, int ILen);
//AdkSetBool
[DllImport("adk.dll", EntryPoint = "_AdkSetBool@12", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkSetBool(int pDb, int iFieldId, int bValue);
//AdkSetDouble
[DllImport("adk.dll", EntryPoint = "_AdkSetDouble@16", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkSetDouble(int pDb, int iFieldId, double dValue);
// AdkSetStr
[DllImport("adk.dll", EntryPoint = "_AdkSetStr@12", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkSetStr(int pDb, int iFieldId, string pValue);
[DllImport("adk.dll", EntryPoint = "_AdkSetDate@12", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkSetDate(int pDb, int iFieldId, int lValue);
//AdkSetData
[DllImport("adk.dll", EntryPoint = "_AdkSetData@12", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkSetData(int pDb, int iIx, int pDataRow);
[DllImport("adk.dll", EntryPoint = "_AdkIsReadWrite@8", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern bool AdkIsReadWrite(int pDb, int iFieldId);
[DllImport("adk.dll", EntryPoint = "_AdkLongToDate@12", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkLongToDate(int lValue, ref string _ppsValue, int Ilen);
[DllImport("adk.dll", EntryPoint = "_AdkDateToLong@8", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkDateToLong(string sValue, ref int plValue);
public static int SPCSDateToLong(DateTime date)
{
int ldate = 0;
SPCSTry(AdkDateToLong(date.ToString(), ref ldate));
return ldate;
}
[DllImport("adk.dll", EntryPoint = "_AdkGetType@12", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkGetType(int pDb, int iFieldId, ref ADK_FIELD_TYPE pType);
[DllImport("adk.dll", EntryPoint = "_AdkGetLength@12", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkGetLength(int pDb, int iFieldId, ref int iLength);
[DllImport("adk.dll", EntryPoint = "_AdkSetSortOrder@8", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkSetSortOrder(int pDb, ADK_SORT_ORDER iFieldId);
[DllImport("adk.dll", EntryPoint = "_AdkGetFieldName@16", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern ADKERROR AdkGetFieldName(int IDataBaseId, int iFieldId, ref string ppsValue, int Ilen);
public static string SPCSGetError(ADKERROR error, ADK_ERROR_TEXT_TYPE errorType)
{
string str = string.Empty;
AdkGetErrorText(ref error, (int)errorType, ref str, 256);
return str;
}
}
}