- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
AnsiString SQLAdderFictDel(TADOQuery * QueryForTry,/*для неотображаемых операций*/
TADOQuery * QueryForOpen,/*для отображаемых операций*/ AnsiString TableName,/*имя таблицы*/ AnsiString Deleted,/*имя поля "признак удаления"*/
AnsiString AutoInc,/*автоинкримент(уникальное в представлении СУБД)*/ AnsiString SQL_TestOnUnique,/*уникальные поля в представлении пользователя(одно или несколько, если таковых нет, то им будет являться автоинкримент(уникальное в представлении СУБД("and id = "+id_который_под_курсором)))*/
AnsiString SQL_Insert_Fields,/*имена полей, в которые надо внести значения*/ AnsiString SQL_Insert_Values,/*вносимые значения*/
AnsiString SQL_Update_Str,/*имена полей и вносимые значения*/ AnsiString CursorRec,/*значение уникального поля под курсором("0", если ToUpdating == false)*/ AnsiString Order,/*упорядочивание*/
bool ToUpdating,/*true, если используется для update*/ bool CursorToAddUpdRec,/*true, если нужно поместить курсор на добавленную запись(только если уникальное поле(в представлении СУБД) - автоинкримент)*/ bool ReturnRealFutureID)/*true, если нужно вернуть значение ID, которое будет добавлено в следующий раз*/
{
AnsiString ValToLocate,/*значение уникального поля будущей записи*/ DP;/*формирование значения уникального поля(либо первое попавшееся удалённое, либо под курсором)*/
if (CursorToAddUpdRec==true&&ToUpdating==false)//ПОИСК ЗНАЧЕНИЯ УНИКАЛЬНОГО ПОЛЯ БУДУЩЕЙ ЗАПИСИ
{
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("select "+AutoInc+" from "+TableName+" where "+Deleted+" = 1 order by "+AutoInc+" asc");//отображаем то, что получилось
QueryForTry->Open();
if (QueryForTry->Eof)
{
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("select max("+AutoInc+") from "+TableName+" where "+Deleted+" = 0");//отображаем то, что получилось
QueryForTry->Open();
ValToLocate=QueryForTry->Fields[0][0]->AsString.ToIntDef(0)+1;
}
else ValToLocate=QueryForTry->Fields[0][0]->AsString.ToInt();
}
else if (CursorToAddUpdRec==true&&ToUpdating==true) ValToLocate=CursorRec;
if (ToUpdating)
{//удаление выделенного поля
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("update "+TableName+" set deleted = 1 where "+AutoInc+" = "+CursorRec);
QueryForTry->ExecSQL();
}
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("select distinct "+Deleted+" from "+TableName+" where "+Deleted+" = 0 "+SQL_TestOnUnique);//проверка на уникальность(есть ли запись со значениями соответствующих полей?)
QueryForTry->Open();
if (!QueryForTry->Eof)
{//если тест на уникальность провален(такая запись уже есть)
if (ToUpdating)
{//восстановление поля, удалённого при выделении
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("update "+TableName+" set deleted = 0 where "+AutoInc+" = "+CursorRec);
QueryForTry->ExecSQL();
}
MessageDlg("Такая запись уже существует!",mtWarning,TMsgDlgButtons()<<mbOK,0);
return ".FAIL.";
}
else
{//проверяются поля с фильтром удаления("удалённые")
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("select distinct "+AutoInc+" from "+TableName+" where "+Deleted+" = 1");//выбрать поля в которых есть признак отсутствия информации(удалённые) и соответствующее им уникальное поле
QueryForTry->Open();
if (!QueryForTry->Eof)
{//если есть поля с фильтром удаления("удалённые")
if (ToUpdating) DP=CursorRec;//для обновления выбирается запись с тем же самым уникальным полем
else DP=QueryForTry->Fields[0][0]->AsString;//для добавления выбирается первая попавшаяся запись с признаком удаления
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("update "+TableName+" set "+Deleted+" = 0, "+SQL_Update_Str+" where "+AutoInc+" = "+DP);//отменить удаление для поля, присвоить ему значения
QueryForTry->ExecSQL();
}
else
{//если нет полей с фильтром удаления, то вставляем как в обычном SQL
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("insert into "+TableName+" ("+SQL_Insert_Fields+","+Deleted+") values("+SQL_Insert_Values+",0)");//SQL вставка
QueryForTry->ExecSQL();
}
QueryForOpen->Close();//отображение и сортировка
QueryForOpen->SQL->Clear();
QueryForOpen->SQL->Add("select * from "+TableName+" where "+Deleted+" = 0 "+Order);//отображаем то, что получилось
QueryForOpen->Open();
if (CursorToAddUpdRec)
{//установка курсора на добавленное значение
TLocateOptions Options;
Options<<loCaseInsensitive<<loPartialKey;
QueryForOpen->Locate(AutoInc,ValToLocate,Options);
}
if (ReturnRealFutureID)//ПОИСК ЗНАЧЕНИЯ УНИКАЛЬНОГО ПОЛЯ БУДУЩЕЙ ЗАПИСИ
{
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("select "+AutoInc+" from "+TableName+" where "+Deleted+" = 1 order by "+AutoInc+" asc");//отображаем то, что получилось
QueryForTry->Open();
if (QueryForTry->Eof)
{
QueryForTry->Close();
QueryForTry->SQL->Clear();
QueryForTry->SQL->Add("select max("+AutoInc+") from "+TableName+" where "+Deleted+" = 0");//отображаем то, что получилось
QueryForTry->Open();
ValToLocate=QueryForTry->Fields[0][0]->AsString.ToIntDef(0)+1;
}
else ValToLocate=QueryForTry->Fields[0][0]->AsString.ToInt();
}
else if (ReturnRealFutureID==false&&CursorToAddUpdRec==false) return ".WIN.";
return ValToLocate;
}
}
Комментарии (0) RSS
Добавить комментарий