У меня есть простой заказ, order_items, схема order_status:
Как видно, и order может иметь несколько order_items. Каждый order_item имеет два (логических) поля: checked_in и Verified.
Статус заказа принимает значения ЗАКАЗАН, ПОЛУЧЕН, ПОЛУЧЕН и ОТМЕНЕН.
После регистрации или проверки order_item я хочу создать триггер базы данных (в таблице order_items), который запрашивает значения для проверенных и проверенных полей для каждого order_item.
Если ни одно из полей не заполнено, заказ получает статус «ЗАКАЗАН». Если все поля заполнены, заказ получает статус «ПОЛУЧЕН». Если что-то среднее между ними, статус заказа «ПОЛУЧАЕТСЯ».
В настоящее время статус устанавливается «вручную», выполнив следующий запрос
SELECT oi.checked_in, oi.verified
FROM order_items AS oi
WHERE order_id = 54;
Что дает такой результат:
Полный код выглядит так:
dsl_shared_ptr<TSQLQuery> q(new TSQLQuery(NULL));
q->SQLConnection = LITDBConnectionDM->SQLConnection1;
int orderID = OrdersCDS->FieldByName("id")->AsInteger;
stringstream query;
query <<
"\
SELECT oi.checked_in, oi.verified \
FROM order_items AS oi \
WHERE order_id = :oID";
q->SQL->Add(query.str().c_str());
q->Params->ParamByName("oID")->AsInteger = orderID;
q->Open();
q->First();
int checkedInCount(0);
int verifiedCount(0);
int recordCount(0);
if(!q->IsEmpty())
{
while(!q->Eof)
{
recordCount++;
if(q->FieldByName("checked_in") && q->FieldByName("checked_in")->AsInteger)
{
checkedInCount++;
}
if(q->FieldByName("verified") && q->FieldByName("verified")->AsInteger)
{
verifiedCount++;
}
q->Next();
}
}
string orderStatus("");
if(checkedInCount == 0 && verifiedCount == 0)
{
orderStatus = "ORDERED";
}
else if(checkedInCount == verifiedCount && checkedInCount == recordCount)
{
orderStatus = "RECEIVED";
}
else
{
orderStatus = "RECEIVING";
}
int order_status = getIDForOrderStatus(orderStatus);
OrdersCDS->Edit();
OrdersCDS->FieldByName("status")->AsInteger = order_status;
OrdersCDS->Post();
OrdersCDS->ApplyUpdates(0);
Как видно, я «вручную» вывожу статус заказа, проверяя проверенные флаги checked_in для каждого элемента order_item.
Как это может быть достигнуто в SQL-запросе внутри триггера?