Информация

Последние записи

Теги


Блоги


Записи из всех блогов на Sql.ru


cxGrid - Data row fixing

В версии 2017.2.2 появилась возможность закреплять вверху или внизу сетки несколько записей, как программно, так и пользователю с помощью мышки.

За это отвечают несколько свойств:
1. Нужно включить GridView.OptionsCustomize.DataRowFixing, чтобы включить этот функционал.

2. Определить, как будет выглядеть в таблице значок, который будет видеть пользователь GridView.FixedDataRows.PinVisibility (rpvAlways, rpvHotTrack or rpvRowHotTrack), если программист собирается дать пользователю управлять закреплёнными строками:
Картинка с другого сайта.

Чтобы программно управлять закреплёнными строками (row), воспользуйтесь свойством DataController.RowFixedState:
cxGrid1DBTableView1.DataController.RowFixedState[0] := rfsFixedToTop; 


Пример цикла:
procedure TForm1.FixRows2;
Var
 colName: TcxGridDBColumn;
 iCurRow: integer;
 ARowInfo:  TcxRowInfo;
begin
  colName := cxGrid1DBTableView1.GetColumnByFieldName(constMyColNAME);
  if not Assigned(colName) then exit;

  cxGrid1DBTableView1.BeginUpdate;
  try

    for iCurRow := 0 to Pred(cxGrid1DBTableView1.DataController.RowCount) do
    begin
      ARowInfo := cxGrid1DBTableView1.DataController.GetRowInfo(iCurRow);

      if ARowInfo.Level < cxGrid1DBTableView1.DataController.Groups.GroupingItemCount then
        Continue
     else
       begin
         //если есть нужное значение, закрепляем строку
         if cxGrid1DBTableView1.DataController.Values[ARowInfo.RecordIndex, colName.Index] = 'my value 123'
         then
           cxGrid1DBTableView1.DataController.RowFixedState[iCurRow] := rfsFixedToTop;


       end;
    end;// for

  finally
    cxGrid1DBTableView1.EndUpdate;
  end;
end;


Ист:
https://www.devexpress.com/Support/Center/Question/Details/K18187/how-to-fix-a-row
http://www.sql.ru/forum/1296597/cxgrid-fixed-data-rows
автор: X11 добавлено: 25 июн 18 просмотры: 14, комментарии: 0



MS SQL Reporting Services. Статистика выполнения отчетов

В продолжении темы с Reporting Services.
Предыдущие были про обновление Reporting Services и про SSL и с ним связанной ошибки. Теперь, после того как обновили до последней версии наш сервер отчетов, настроили SSL, мы решили провести аудит своих более N -cотен отчетов:

Какие отчеты используются? Как часто и кем? Что вообще не используются?


Получение данной информации не составит труда и база данных Reporting Services уже содержит необходимую информацию для ответов наших вопросов в предоставлении [dbo].[ExecutionLog] которая берет информацию из таблицы [dbo].[ExecutionLogStorage]. Более подробно описано ниже ...
автор: dbasimple добавлено: 18 июн 18 просмотры: 169, комментарии: 0



Reporting Services. Делаем доверенным сайт отчетов.



После установки Reporting Services на сервер и привязки web ресурса к протоколу SSL, где по умолчанию прописывается сертификат сервера, сайт все еще считается не безопасным и не разрешенным.

Получается вроде сайт безопасный, а браузер говорит нет:


Если сервер отчетов работает только для сотрудников компании, ограниченному числу лиц, то это не проблема, но если сервисом пользуются внешние сотрудники или данные ресурс используется для официальных отчетов, то сервис должен быть оформлен в плане безопасности согласно современным средствам, в том числе и доверительным сертификатом. А иногда просто надоедает предупреждение браузера. Ниже описываю как это делается и решение небольшой проблемы с которой столкнулся ...
автор: dbasimple добавлено: 07 июн 18 просмотры: 417, комментарии: 0



Ошибка при создания SQL задания… Try again later.


После переноса SQL задания на новый SQL Server получил ошибку при создании и правки SQL задания:

Cannot perform this operation while SQLServerAgent is starting. Try again later.





При том, что сервер работает уже давно, а создать новое задание не дает.
Смотрим журналы SQl агента, видим ошибки:

[191] Warning [4]: Possible date calculation spin for Schedule 38
Date                      16.05.2018 13:22:08
Log                        SQL Server Agent (Archive #1 - 16.05.2018 13:22:00)
Message
[192] Date calculation spin detected for Schedule 38

Ошибка связана  тем, что SQL не "может рассчитать" время запуска для некоторых расписаний.
Смотрим расписания SQL агента:

Обращаем на задания которые созданы давно и их частота запуска очень большая: каждые N секунд , минуты.



Решения: меняем время активации данных заданий на текущую дату. 

Проблема в том, что SQL «просто не может рассчитать время запуска» с момента старта распиcания.
Как такое может быть - SQL расписание переносится в процессе миграций с SQL заданиями, при обновлениях SQL версий и т.к. Даже выше у меня есть расписание, созданное в 2008 году, т.е более 10 лет, и если бы оно еще запускалось каждые 10 секунд, то была бы выше указанная проблема.
Эти расписания можно получить  так же запросом:

use msdb

select name , active_start_date,date_created,* from dbo.sysschedules order by 2


После того как исправил дату , все рассчиталось и проблема исчезла.

автор: dbasimple добавлено: 27 май 18 просмотры: 546, комментарии: 0



Sum по disitnct полю , в другой колонке

Блог: Oracle SQL
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA
-- итак требуется найти сумму по distinct полю на основе идентификатора, который находится в другой колонке
-- есть доп условие нельзя использовать подзапрос, то есть необходимо выполнить задачу за одно обращение


-- подготовим данные для тестового примера
drop table t; -- если надо
create table t as
WITH r AS (
select /*+ materialize */ * from ALL_OBJECTS WHERE ROWNUM < 100 )
select object_id as id,length(r.object_name) as fid,
 (select count(1) from r a where length(r.object_name) = length(a.object_name))  as price   
from r


-- есть вторичный ключ fid от которого зависит значение в поле price
-- необходимо найти сумму по полю price в distinct поля fid одним запросом, то есть без вложенного select

select sum(price) sm from t 
-- это неправильное решение

select sum(distinct price) sm from t 
-- и это неправильное решение price может быть одинаковый для разных fid
-- надо как то так
select sum(price distinct fid) sm from t
-- но так написать нельзя

-- первое решение,
-- работает быстро, но решение не идеально, ключ может быть и не числовой
-- сумма Id + price - сумма id
-- , во избежание неприятностей использовали to_number(rpad(fid, 20)
select sum(distinct to_number(rpad(fid,10,'0')) +price) -  sum(distinct to_number(rpad(fid,10,'0'))) as sm  from t


-- решение второе - используем model
  select r from  t 
   model
   return updated rows   
   dimension by(id)
  measures(0 r, nullif(price, lag(price)over(partition by fid order by id)) lg)
  rules upsert(r[0] = sum(lg)[any])
автор: Myp3_u_K добавлено: 23 май 18 просмотры: 589, комментарии: 0



Ретроспективные запросы и корзина ORACLE

Блог: Oracle SQL
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

А что если нам необходимо узнать , какие данные были в раньше до выполнения операций модификации данных....
как это сделать ?,
Для этого в Oracle предусмотрен механизм ретроспективных запросов (Flashback Query);
То есть, мы можем с помощью запросов посмотреть в прошлое.
Пример подобного запроса
для примера нам понадобится таблица
create table obj_t -- table 
as select owner, object_type  from all_objects group by owner, object_type;
;

запомним время создания таблицы 17:01:01

delete obj_t where object_type = 'TABLE';

удалим наименования таблиц
и запомним время 17:10:14

delete obj_t where owner in ('SYS', 'SYSTEM');

удалим наименования таблиц
и запомним время и запомним время 17:11:22

select *
  from obj_t ;

нет таблиц , нет обьектов owner = sys system

select *
  from obj_t as of scn timestamp_to_scn(to_timestamp('19/04/2018 17:10:00','DD/MM/YYYY HH24:MI:SS')) ;

есть таблицы, нет обьектов owner = sys system

select *
  from obj_t as of scn timestamp_to_scn(to_timestamp('19/04/2018 17:11:00','DD/MM/YYYY HH24:MI:SS')) ;

видим обьекты owner = sys system
читать дальше...
автор: Myp3_u_K добавлено: 17 май 18 просмотры: 678, комментарии: 0



BACKUP –да знаем, BUFFERCOUNT- нет, не знаем.


Операцию резервного копирования знает каждый администратор и разработчик.
Кто-то делает это через графический интерфейс, кто-то через команду BACKUP DATABASE.  Если база данных небольшая, то команда backup происходит довольно быстро и каких либо проблем не создает, но если база данных уже более 500 Гб, то создание резервной копии может создавать проблемы и создание резервной копии будет занимать уже достаточное время, еще хуже будет если размер базы данных будет 1Тб-ы, а то и 10-100- и терабайт, тогда уже необходимо думать над оптимизацией команды резервного копирования.


Мы не будем заострять внимание на схеме резервного копирования, а остановимся на некоторых дополнительных параметрах резервного копирования. Мало кто использует дополнительные параметры в команде. Полное описание параметров команды BACKUP DATABASE есть на сайте MS.

Среди этих параметров есть параметры:
  BUFFERCOUNT = { buffercount | @buffercount_variable }  
  MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable } 

Их описание:

BUFFERCOUNT = { buffercount | @buffercount_variable }
Указывает общее число буферов ввода-вывода, которые будут использоваться для операции резервного копирования. Можно указать любое целое положительное значение, однако большое число буферов может вызвать ошибку нехватки памяти из-за чрезмерного виртуального адресного пространства в процессе Sqlservr.exe.

MAXTRANSFERSIZE = &#...
читать дальше...
автор: dbasimple добавлено: 12 май 18 просмотры: 792, комментарии: 0



Конструкция With и Function

Блог: Oracle SQL
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

В SQL диалекте Oracle 12C есть возможность определить функцию или процедуру на языке PL/SQL с помощью оператора WITH, используя обычный SQL


Синаксис
WITH
 PROCEDURE <NAME_PROCEDURE> 
 BEGIN
 ... 
 END;

 FUNCTION <NAME_FUNCTION>
 BEGIN
   ...
 END;
SELECT <NAME_FUNCTION>
FROM <TABLE>;


Примеры
Вывести на экран тип объекта Перевернуть слова означающие типы объектов в ALL_OBJECTS, ограничить выборку 100 строками
WITH
  FUNCTION reversive_fnc(p_name VARCHAR2) RETURN VARCHAR2
  is i NUMBER; v VARCHAR2(50);
  begin
    FOR i IN 1..LENGTH(p_name) LOOP
      v := v || SUBSTR(p_name, LENGTH(p_name)-i+1, 1);
    END LOOP; 
    return v; 
  end;
SELECT DISTINCT reversive_fnc(object_type) as rname, object_type FROM all_objects WHERE rownum < 101;


Добавить к идентификатору объекта заданное кол нулей , преобразовать к числу, ограничить выборку 100 строками
WITH
  FUNCTION incid_fnc(p_id NUMBER, p_count NUMBER) RETURN NUMBER
  is
  begin     
    return TO_NUMBER(rpad(p_id , p_count, '0')); 
  end;
SELECT object_id, incid_fnc(object_id, 10) fn FROM all_objects WHERE rownum < 101
автор: Myp3_u_K добавлено: 02 май 18 просмотры: 897, комментарии: 1



Обновление MS SQL Server Reporting Services 2014 до 2017



Имеем сервер отчетов на основе MS SQL Server2014, более 100 отчетов, столько же DataSet-ов, 10-к каталогов отчетов с разделенными правами, плюс два десятка строк подключений, где прописаны строки подключения с паролями. База данных Reporting Services так же хранится локально на MS SQL Server2014. Время идет и текущий сервер необходимо обновлять до версии 2017. В данной статье опишу шаги, которые позволяют обновить SQL Reporting Services.


Итак, первое самое главное при начале любых работ по изменению конфигураций, это наличие резервных копий, в нашем случае это баз данных Reporting Services, по умолчанию базы данных
[ReportServer]
[ReportServerTempDB]
и ключ шифрования. Создать резервную копию ключа шифрования можно в разделе «Encryption Keys» приложения «Reporting Services Configuration Manager»

При создании, укажите пароль, который понадобится при восстановлении.

После этого нам необходимо, обновить СУБД SQL Server и службу Reporting Services, либо мы можем все удалить и поставить чистый экземпляр SQL Server и Reporting Services. Для уменьшения простоя недоступности, мы обновим SQL Server поверх, выбрав в установщике MS SQL Server2017 обновлений MS SQL Server до версии 2017. Во время выбора параметров, установщик вам сообщит, что для обновления MS SQL Reporting Services текущий экземпляр нужно удалить, а для установки версии 2017 Reporting Services нужно отдельно скачать и установить данное приложение:



Так и делаем, обновляем SQL Server и удаляем службу MS SQL Reporting Services. ...
читать дальше...
автор: dbasimple добавлено: 01 май 18 просмотры: 847, комментарии: 0



WPF:Размер окна в зависимости от текущего монитора

Блог: gpu blog
Дано
WPF-Приложение и комп с 2-мя мониторами с разным разрешением (e.g. 2560х1440) и (1920х1080).

Задача
В зависимости от текущего монитора использовать максимально доступную область для главного окна приложения.

К сожалению получение информации о подключенных мониторах доступно для Windows Forms и не доступно для WPF.
При невозможности использования Windows Forms можно использовать p-invoke для доступа к системным функциям User32.dll.

Решение на VB.Net
Определяем необxодимые нам структуры (RectStructure, MonitorInfo)
<StructLayout(LayoutKind.Sequential)>
Public Structure RectStructure
    Public Left As Integer
    Public Top As Integer
    Public Right As Integer
    Public Bottom As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
Public Structure MonitorInfo
    Public Size As Integer
    Public Monitor As RectStructure
    Public WorkArea As RectStructure
    Public Flags As UInteger
End Structure

И внешние методы>
<DllImport("user32.dll")>
Private Shared Function GetWindowRect(ByVal windowHandle As IntPtr, ByRef rectangle As RectStructure) As Boolean
End Function

<DllImport("user32.dll")>
Private Shared Function MonitorFromRect(<[In]> ByRef rectPointer As RectStructure, ByVal flags As UInteger) As IntPtr
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)>
Private Shared Function GetMonitorInfo(ByVal hmon As IntPtr, ByRef mi As MonitorInfo) As Boolean
End Function

Пишем вспомогательный метод для получения хендл монитора из хендла окна>
Private Const MONITOR_DEFAULTTONEAREST As UInteger = 2
Private Shared Function GetMonitorHandleByWindow(ByVal windowHandle As IntPtr) As IntPtr
    Dim rect As New RectStructure()
    GetWindowRect(windowHandle, rect)
    Dim monitorHandle = MonitorFromRect(rect, MONITOR_DEFAULTTONEAREST)
    Return monitorHandle
End Function

И собственно функцию которая будет нами использована в приложении для установки размера и положения окна>
Public Shared Function SetWindowDimensions(window As Window) As Boolean
    Dim ret As Boolean = False
    If window.IsActive Then
        Dim wih As New WindowInteropHelper(window)
        Dim winHandle As IntPtr = wih.Handle
        If winHandle <> IntPtr.Zero Then
            Dim monitorHandle As IntPtr = GetMonitorHandleByWindow(winHandle)
            Dim mi = New MonitorInfo()
            mi.Size = CUInt(Marshal.SizeOf(mi))
            GetMonitorInfo(monitorHandle, mi)
            window.Height = mi.WorkArea.bottom - mi.WorkArea.Top
            window.Width = mi.WorkArea.Right - mi.WorkArea.Left
            window.Left = mi.WorkArea.Left
            window.Top = mi.WorkArea.Top
            ret = True
        End If
    End If
    Return ret
End Function

Как мы видим размер и положение окна будет производиться только при условии что окно активировано и возможно получить хендла окна из обькта window.
Опытным путем было выяснено что очень важно вызвать SetWindowDimensions в правильном месте в правильное время. В зависимости от настроек системы и того
на каком монитире мы стартуем наше приложение , мы можем получить не тот монитор на котором приложение окончательно будет отображено.
Например, мы стартуем приложение на втором мониторе и второй монитор будет корректно возвращаться нам как текущий монитор при>
- Инициализации проложения (Application_Startup)
- Главное окно приложения загружено (Loaded)
- Главное окно приложения активировано (OnActivated)

Но после этого при дальнейшей инициализации (загрузка подконтролов) внезапно получим первый монитор как текущий вместо ожидаемого второго.
Так что выбор места для вызова SetWindowDimensions очень важен, по крайней мере в моем случае ето было именно так.
Возможно ето не всегда так и SetWindowDimensions спокойно можно вызывать скажем когда главное окно приложения активировано.
автор: gpu добавлено: 25 апр 18 просмотры: 827, комментарии: 3


предыдущие записи