SELECT
sc.data,
SUM(n.Kolvo * n.Cena) itogo,
SUM(n.Kolvo * n.Cena)-IFNULL(o.opl,0) ostatok,
o.opl,
p.Nazv,
sc.id
FROM
habr.naimen n
LEFT JOIN
habr.schet sc
ON sc.id = n.Schet
LEFT JOIN habr.postav p
ON p.id = sc.OtKogo
LEFT JOIN habr.oplata o
on o.Schet = sc.id
GROUP BY
n.Schet
function WTSGetActiveConsoleSessionId: DWORD; stdcall; external 'Kernel32.dll';
function WTSQueryUserToken(SessionId: DWORD; phToken: pHandle):bool;stdcall;external 'wtsapi32.dll';
if WTSQueryUserToken(WtsGetActiveConsoleSessionID,@hToken) then
begin
ZeroMemory(@si,SizeOf(si));
si.cb:=SizeOf(si);
si.lpDesktop:=nil;
CreateProcessAsUser(hToken,nil,PANSIChar(FilePath),nil,nil,False,0,nil,nil,si,pi);
CloseHandle(hToken);
end;
function ExecAndWait(const FileName,
Params: ShortString;
const WinState: Word): boolean; export;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: ShortString;
begin
{ Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }
CmdLine := '"' + Filename + '" ' + Params;
FillChar(StartInfo, SizeOf(StartInfo), #0);
with StartInfo do
begin
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WinState;
end;
Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
{ Ожидаем завершения приложения }
if Result then
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
{ Free the Handles }
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecAndWait( 'C:\windows\notepad.exe', '', SW_SHOWNORMAL);
end;
</code>
попробуйте :)