Перестановкой SELECT a, b, c, q… все исправилось. Я решил теперь использовать в таких (live) запросах только SELECT *.
Как поймать свой RAISEERROR в Delphi?
Nomadicотвечает:
procedureTFDMUtils.GeneralError( DataSet: TDataSet; E: EDatabaseError; varAction: TDataAction);
var
i: Word;
ExtInfo : String;
begin
ExtInfo := '';
if(E isEDBEngineError) then begin
if(EDBEngineError(E).Errors[0].NativeError = 0) then begin// Local Error
ifEDBEngineError(E).Errors[0].Errorcode = 9732 then
ExtInfo := DataSet.FieldByName(trim(copy(E.Message, 29, 20))).DisplayLabel;
.......................................
end
else begin// Remote SQL Server error
ExtInfo := ExtractFieldLabels(DataSet, E.Message);
caseEDBEngineError( E ).Errors[0].NativeError of
233, 515:
Alert('Ошибка', 'Hе все поля заполнены ! ' + ExtInfo);
547:
if(StrPos(PChar(E.Message), PChar('DELETE')) <> nil) then
Alert('Ошибка пpи удалении', 'Имеются подчиненные записи, удаление (изменение) невозможно! ' + ExtInfo)
else if(StrPos(PChar(E.Message), PChar('INSERT')) <> nil) then
Alert('Ошибка пpи вставке', 'Отсутствует запись в МАСТЕР-таблице!' + ExtInfo)
else if(StrPos(PChar(E.Message), PChar('UPDATE')) <> nil) then
Alert('Ошибка пpи обновлении', 'Отсутствует запись в МАСТЕР-таблице! ' + ExtInfo);
2601:
Alert('Ошибка', 'Такая запись уже есть!');
else
Alert('Ошибка', 'Hеизвестная ошибка, код – ' + inttostr(EDBEngineError(E).Errors[0].NativeError) + ExtInfo);
end;
end;
end;
end;
Этот код был заточен под MSSQL, но не нужно пытаться его использовать, а лучше по этому пpимеpу написать свою процедуру.
Как добиться верной работы фильтра на запросах и на неиндексированных таблицах?
Nomadicотвечает:
(Т.е. при работе программы наблюдалась следующая картина: в результате очередной фильтрации оставалось видно 4 записи из восьми. Добавляем букву к фильтру, остается, допустим, две. Убираем букву, которую только что добавили, в гриде все равно видно только две записи)
Эта проблема была в Delphi 3.0 только на TQuery, а в Delphi 3.01 появилась и в TTable.
Лечится так (простой пример):
procedureTMainForm.Edit1Change(Sender: TObject);
begin
iflength(Edit1.Text) > 0 then begin
Table1.Filtered := TRUE;
UpdateFilter(Table1);
end
elseTable1.Filtered := FALSE;
end;
procedureTMainForm.UpdateFilter(DataSet: TDataSet);
varFR: TFilterRecordEvent;
begin
withDataSet do begin
FR := OnFilterRecord;
ifAssigned(FR) andActive thenbegin
DisableControls;
try
OnFilterRecord := nil;
OnFilterRecord := FR;
finally
EnableControls;
end;
end;
end;
end;
Как бы мне соорудить в SP исключение, чтобы его увидел Delphi-клиент?
Nomadicотвечает:
sqlstate='99999'не подходит, так как хочется на клиенте видеть код исключения.
Используй RAISERRORс кодом > 20000. Если еще при этом научишься без потерь передавать на Delphi-клиента русские ругательства, то скажи мне как ты этого добился :).
Когда я применяю ApplyUpdates на ClientDataSet, на серверной стороне не срабатывает событие OnNewRecord для оригинального набора данных. Как это исправить?
Nomadicотвечает:
Никак. Эти обновления идут прямо через BDE, а не через компонент набора данных.
В Delphi 4.0 (C++Builder 4.0) ситуация радикально изменилась.
Во-первых, обычному провайдеру данных ( TProvider) можно указать, каким образом обновлять данные.
Во-вторых, новый тип провайдера ( TDataSetProvider) работает только через соответвующие методы TDataSet.
То есть – все события при данных условиях на сервере будут отрабатываться обычным образом.
Если же Вы пользуетесь более старой версией Delphi, то, как обычно, можно посоветовать использование хранимых процедур, в данном контексте это будут методы сервера приложений. К сожалению, совет неприемлем для транспорта Sockets.
Тема: Функции дат в SQL
Кто-нибудь знает как «вытащить» месяц или год из datetime-поля с помощью SQL? Я знаю, что QBE этого не может. SQL в состоянии это сделать?
Как насчет функции EXTRACT?
SELECT SALEDATE,
Читать дальше