Информация

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

Теги


Блоги


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


Сохранение данных таблицы в запрос настройки

Блог: ABAP Thinking
Друзья, хочу опубликовать код, позволяющий сохранять записи таблицы словаря в транспортный запрос настройки для переноса в другие системы на примере небольшой подпрограммы:
FORM PUT_TO_TRANSPORT TABLES lt_wanid TYPE tty_wanid.

  DATA: l_order LIKE e070-trkorr,
            l_task  LIKE e070-trkorr.

 "Внутренние таблицы с ключами строк таблицы словаря, помещаемыми в запрос
  DATA: lt_e071  TYPE e071  OCCURS 4  WITH HEADER LINE,
            lt_e071k TYPE e071k OCCURS 25 WITH HEADER LINE.
  DATA: lv_wanid type wanid,
            ls_tvwa type tvwa.
  ranges: lr_wanid for tvwa-wanid.
* >>> Формирование данных для включения записей в транспортный запрос -&
  DEFINE mac__add_table. "Макрос для заполнения 
    clear lt_e071.
    lt_e071-pgmid    = 'R3TR'.
    lt_e071-object   = 'TABU'.
    lt_e071-obj_name = &1.
    lt_e071-objfunc  = 'K'.
    append lt_e071.
    lt_e071k-pgmid      = 'R3TR'.
    lt_e071k-object     = 'TABU'.
    lt_e071k-objname    = &1.
    lt_e071k-mastertype = 'TABU'.
    lt_e071k-mastername = &1.
    lt_e071k-tabkey    = sy-mandt. "Первая часть ключа у таблиц - мандант
    case &1.
      when 'TVWA'.  " В запрос помещается содержимое 2х таблиц TVWA и TVWAТ
        lt_e071k-tabkey+3  = lv_wanid. "Вторая часть ключа для таблицы  TVWA
     when 'TVWAT'.
        lt_e071k-tabkey+3 =  sy-langu. "Вторая часть ключа для таблицы  TVWAT - язык
        lt_e071k-tabkey+4  = lv_wanid. "Третья часть ключа для таблицы  TVWAT 
    endcase.
    append lt_e071k.
  END-OF-DEFINITION.
* <<< -----------------------------------------------------------------*
  loop at lt_wanid into lv_wanid.
    select SINGLE * from tvwa into ls_tvwa WHERE wanid = lv_wanid.
    
* Формирование данных присвоения
    mac__add_table: 'TVWA',
                    'TVWAT'.

  endloop.
  if lt_e071[] is NOT INITIAL and lt_e071k[] is NOT INITIAL.
* Выбор запроса на перенос (запрос инструментальных средств)
    CALL FUNCTION 'TR_ORDER_CHOICE_CORRECTION'
      EXPORTING
        iv_category = 'SYST'                                "#EC NOTEXT
      IMPORTING
        ev_order    = l_order
        ev_task     = l_task
      EXCEPTIONS
        OTHERS      = 1.
    IF sy-subrc <> 0.
      exit.
    ENDIF.
* Присвоение данных запросу
    CALL FUNCTION 'TR_APPEND_TO_COMM_OBJS_KEYS'
      EXPORTING
        wi_trkorr = l_task
      TABLES
        wt_e071   = lt_e071
        wt_e071k  = lt_e071k
      EXCEPTIONS
        OTHERS    = 1.
    IF sy-subrc <> 0.
*   MSG: ошибка присвоения данных запросу
    ENDIF.
  endif.

ENDFORM.                    " PUT_TO_TRANSPORT
автор: Изя Шниперсон добавлено: 10 авг 18 просмотры: 56, комментарии: 0



Регистронезависимый Contains в Delphi

В справке по System.SysUtils.TStringHelper.Contains написано, что Contains - This function is case-sensitive.

А как сделать Contains case-insensitive?
Можно воспользоваться другими функциями, например, ToUpper.
Итого:
'Test'.ToUpper.Contains('s'.ToUpper)

вернёт true
автор: X11 добавлено: 06 авг 18 просмотры: 121, комментарии: 0



IDisposable - что ваша мама не говорила об освобождении ресурсов. Что не так с IDisposble.

Блог: Gandjustas' blog

Это перевод первой части статьи https://www.codeproject.com/Articles/29534/IDisposable-What-Your-Mother-Never-Told-You-About. Статья была написана в 2008 году. Спустя 10 лет почти не потеряла актуальности.

Детерминированное освобождение ресурсов - необходимость

В течение более чем 20-летнего опыта кодирования я иногда разрабатывал собственные языки для решения задач. Они варьировались от простых имеративных языков до специализрованных регулярных выражений для деревьев. При создании языков есть множество рекомендаций и некоторые простые правила не должны нарушаться. Одно из них:

Никогда не создавай язык с исключениями, в котором нет детерминированного освобождения ресурсов.

Угадайте какой рекомендации не следует рантайм .NET, и как следствие все языки на его базе?

Причина по которой существует данное правило - детерминированное освобождение ресурсов необходимо для создания поддерживаемых программ. Детерминированное освобождение ресурсов обеспечивает определенную точку, в которой программист уверен, что ресурс освобожден. Существует два способа написания надежных программ: традиционный подход - освобождать ресурсы как можно раньше и соверменный подход - с освобождением ресурсов в течение неопределенного времени. Преимущество современного подхода в том, что программисту не надо явно освобождать ресурсы. Недостаток в том, что гораздо сложнее написать надежное приложение, появляется много трудноуловимых ошибок. К сожалению рантайм .NET создан с использование...

читать дальше...
автор: gandjustas добавлено: 18 июл 18 просмотры: 499, комментарии: 0



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 просмотры: 677, комментарии: 0



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

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

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


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



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



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

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


Если сервер отчетов работает только для сотрудников компании, ограниченному числу лиц, то это не проблема, но если сервисом пользуются внешние сотрудники или данные ресурс используется для официальных отчетов, то сервис должен быть оформлен в плане безопасности согласно современным средствам, в том числе и доверительным сертификатом. А иногда просто надоедает предупреждение браузера. Ниже описываю как это делается и решение небольшой проблемы с которой столкнулся ...
автор: dbasimple добавлено: 07 июн 18 просмотры: 868, комментарии: 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 просмотры: 957, комментарии: 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 просмотры: 1069, комментарии: 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 просмотры: 1159, комментарии: 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 просмотры: 1297, комментарии: 0


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