• Как посчитать количество разделителей в строке?

    @KTG Автор вопроса
    FOR /F %%N IN ('">$ cmd/v/c echo.!var!& echo $"') DO (
    							SET /a length=%%~zN-2& del $
    						)
    						SET parts_cnt=0
    						FOR /L %%V IN (0,1,!length!) DO (
    							SET symb=!var:~%%V,1!
    							IF !symb! == ^^ (
    								SET /A parts_cnt += 1
    							)							
    						)


    Исключая само понимание условия первого цикла, всё просто.
    Считаем количество символов, что бы поставить максимальное значение в числовой цикл, который генерирует стартовую позицию для извлечения подстроки длиной в 1 символ.
    Можно было не считая длину строки подставлять просто больше число.
    Ответ написан
  • [SQLPLUS] Как получить количество возвращаемых строк?

    @KTG Автор вопроса
    сделал так:
    DECLARE 
    		row_count NUMBER;
    	BEGIN
    		SELECT COUNT(line) INTO row_count FROM TABLE(usr.util_pack.Get_List);	
    		IF row_count < 1 THEN
         		RAISE_APPLICATION_ERROR(-20000, 'Empty query result: tables list');
         	END IF;
    	END;
    	/
    SELECT * FROM TABLE(usr.util_pack.Get_List);
    Ответ написан
  • Как правильно сформулировать условие?

    @KTG
    Если есть возможность посчитать количество элементов: count < длина последовательности - 1
    Если нет, то производи расчёт с опозданием на 1 элемент, а текущий не обсчитывай.
    Ответ написан
  • Как заполнить пустые строки предыдущим значением (lag + left join)?

    @KTG Автор вопроса
    Хотя мне не особо нравится идея вложенного запроса, и есть подозрение на более изящное решение.
    Но пока пришлось делать так:

    SELECT
          ds#.LSTDATE
        , cus.id
        , CASE b.date WHEN IS NULL
                THEN (
                        SELECT max(bprev.SUM) KEEP (DENSE_RANK LAST ORDER BY bprev.date)
                            FROM bal bprev
                            WHERE bprev.date < ds#.LSTDATE
                              AND SIGN(pbrev.sum) != 0)
                     )
                ELSE b.sum
          END AS OST
        FROM customer cus
        CROSS JOIN DAYS# ds#
        LEFT JOIN bal b ON b.id = cus.id
                       AND b.date = ds#.LSTDATE
        ORDER BY ds#.LSTDATE
    Ответ написан
    Комментировать
  • Как записать выборку во временный массив Oracle?

    @KTG Автор вопроса
    Добавил еще один массив для сбора
    Инициализировал оба массива что бы не вызвало ошибку если пустые.
    arrAllItem arr_table := arr_table()
    После BULK COLLECT выполняю
    arrAllItem := arrAllItem MULTISET UNION arrItem;

    Правда кажется костыль, т.к. на большой объеме данных будет тяжеловато объединение.
    Ответ написан
    Комментировать
  • Как корректно построить запрос к двум таблицам?

    @KTG Автор вопроса
    Можно избежать ошибки задвоения записи, если пользователь в одной категории имеет более 1 группы сделав еще одну обертку из Select с группировкой, и подсчет вхождений вынести

    SELECT
        COUNT(UserID)
      , UserName
      FROM 
        (
        SELECT
            UserID
          , UserName
          , Cat
          FROM usertable ut
            INNER JOIN catgrouptable cg ON ut.UserID = cg.UserID
              AND (
                           (cg.cat = 1 AND cg.group IN (3,10,9))
                        OR (cg.cat = 4 AND cg.group IN (1,2,3,20))
                         --  неопределенное количество условий вхождения в группы и категории
                       )
          GROUP BY UserID, UserName, Cat
        )
    GROUP BY UserName
    HAVING COUNT(UserID) = 2 -- число проверяемых категорий
    Ответ написан
    Комментировать
  • Как сделать отбор по вхождению части строки с разделителями в строку с разделителями?

    @KTG Автор вопроса
    Буду использовать список значений в виде строки с разделителем.
    Разобью её на табличные строки:
    WITH
        val_list# AS
        (   
            SELECT 'a;b;c;d;z' AS lst FROM dual
        )
    
    SELECT
          REGEXP_SUBSTR(lst, '[^;]+', 1, level) AS val
        FROM
            val_list#
        CONNECT BY level <= REGEXP_COUNT(lst, ';')+1

    Дальше просто буду каждое значение из таблицы сопоставлять по вхождению в поле 'groups' таблицы 'data_table'.

    Правда пока не понятно что лучше, в плане производительности.
    Виртуально плодить строки в таблице 'data_table' разбивая так же на каждое найденное значение в поле 'groups'.
    Или к каждой строке подключать таблицу значений.
    Оба варианта пока смущают, а третий вариант еще не придумал...

    Хотя было бы неплохо брать 1-ое значение, прогонять по таблице, при найденном совпадении неким образом помечать/отбрасывать строки, а уже по 2-му значению прогонять только оставшиеся и т.д.
    Но как?

    to be continued
    Ответ написан
  • Какаую оперативку из двух выбрать для ноутбука?

    @KTG Автор вопроса
    Спасибо за ответы. Но почему-то при планках в 8Gb ноут включается но экран остается черным. Думал шлейф перегнул и повредил, но вернул старую память - заработало.
    Ответ написан
    Комментировать
  • Как добавить дополнительные свойства объектам одного класса и сделать обработчик один на всех?

    @KTG Автор вопроса
    В итоге вышло вот так:
    unit DynamicGrid;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.UITypes, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, CompoMansEh, Vcl.ExtCtrls,
      PivotGridToolsEh, Data.DB, EhLibVCL, GridsEh, DBAxisGridsEh, DBVertGridsEh,
      Vcl.StdCtrls, Vcl.DBCtrls, Data.Win.ADODB, DBGridEhGrouping, ToolCtrlsEh,
      DBGridEhToolCtrls, DynVarsEh, DBGridEh, System.ImageList, Vcl.ImgList;
    
    
    type
      TDynamicGrid = class(TDBGridEh)
        private
          PanelOnGrid: TPanel ;
          HighlightColor: TColor;
          GlobalArrSList: TStringList;
          FieldForPanel: String;
          FieldForkey: String;
        public
          property FieldPanel : String read FieldForPanel write FieldForPanel;
          property FieldKey : String read FieldForKey write FieldForKey;
          property GridPanel : TPanel read PanelOnGrid write PanelOnGrid;
          property HColor: TColor read HighlightColor write HighlightColor;
          property GlobalArr: TStringList read GlobalArrSList write GlobalArrSList;
    
          procedure ShowPanel(Sender: TCustomDBGridEh;
                    CursorPos: TPoint; Cell: TGridCoord; InCellCursorPos: TPoint;
                                    Column: TColumnEh; var Params: TDBGridEhDataHintParams;
                                                    var Processed: Boolean);
    
          constructor Create(AOwner : TComponent); override;
          destructor Destroy; override;
     end;
    
    implementation
    
    procedure TDynamicGrid.ShowPanel;
    var
     ScrPt, GrdPt: TPoint;
     grCell: TGridCoord;
     rect: TRect;
     rectX, rectY : extended;
     Name, ID: string;
    begin
      ScrPt := Mouse.CursorPos;
      GrdPt := self.ScreenToClient(ScrPt);
    
      grCell := self.MouseCoord(GrdPt.X, GrdPt.Y);
    
      rect := self.CellRect(grCell.X, grCell.Y);
    
        rectX := Rect.TopLeft.X + Rect.Width;
        rectY := Rect.TopLeft.Y + Rect.Height/2 + Rect.Height - 1;
    
      if grCell.Y = self.Row then
        self.PanelOnGrid.Color := self.HColor
      else
        self.PanelOnGrid.Color := clWhite;
    
        self.PanelOnGrid.Left := trunc(rectX - self.PanelOnGrid.Width/2);
        self.PanelOnGrid.Top := trunc(rectY);
    
        self.PanelOnGrid.Visible := true;
    
        Name := self.DataSource.DataSet.FieldByName(self.FieldPanel).AsString;
          ID := self.DataSource.DataSet.FieldByName(self.FieldKey).AsString;
    
        self.GlobalArr.Values[self.FieldKey] := ID;
        self.GlobalArr.Values[self.FieldPanel] := Name;
    
       TForm(self.Parent).caption := 'Справочник: ' + Name;
    end;
    
    constructor TDynamicGrid.Create(AOwner: TComponent);
    begin
      inherited;
      self.OnDataHintShow := showpanel;
    end;
    
    destructor TDynamicGrid.Destroy;
    begin
      inherited;
    end;
    
    end.
    Ответ написан
    Комментировать
  • Как сделать предопределенный обработчик события в Delphi?

    @KTG Автор вопроса
    В классе описал процедуру с теми же параметрами которые она принимает.
    procedure ShowPanel(Sender: TCustomDBGridEh;
                    CursorPos: TPoint; Cell: TGridCoord; InCellCursorPos: TPoint;
                                    Column: TColumnEh; var Params: TDBGridEhDataHintParams;
                                                    var Processed: Boolean);


    Процедуру саму описывал без параметров
    procedure TDynamicGrid.ShowPanel;
    var
    begin
    end;

    присваивал так:
    constructor TDynamicGrid.Create(AOwner: TComponent);
    begin
      inherited;
      self.OnDataHintShow := showpanel;
    end;


    Изначально ошибка была в том, что при создании DBGrid - он еще не имеет колонок (индексов колонок, имен колонок). Вот и обращался не пойми куда.

    Но тут скорей придется в ShowPanel, отдельно проверять что это событие нужной колонки.
    Ответ написан
    Комментировать
  • Delphi. Как из события с message CM_MOUSEENTER вызывать событие с CM_MOUSEENTER?

    @KTG Автор вопроса
    Получаю handler текущего компонента, без извращений с CM_MOUSEENTER. Просто в момент ухода с Grid'а смотрю что под курсором:
    var
      MouseCoord : TPoint;
    begin
    GetCursorPos(MouseCoord);
    integer(FindDragTarget(MouseCoord, false)
    Ответ написан
    Комментировать
  • Delphi. Hint. Как задать скорость появления подсказки?

    @KTG Автор вопроса
    При первом наведении мыши на DBgrid ставлю Application.HintPause := 0;
    И меняю его к стандартному при уходе с компонента, по событию MouseLeave (CM_MOUSELEAVE).
    Аpplication.HintPause := 500;
    Ответ написан
    Комментировать
  • Delphi. DBGridEh. Как получить данные ячейки при наведении на неё курсора мыши?

    @KTG Автор вопроса
    type
      TCrackDBGrid = class(TDBGridEh)
      end;
    ...
    var
      MoveFlag: integer;
    ...
    procedure TFSprav.DBGridEh2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
     grCoord: TGridCoord;
     aGrid: TCrackDBGrid;
     NewActiveRecord, oldActiveRecord: integer;
     delta: string;
    begin
      if MoveFlag <> 1 then
        begin
          MoveFlag := 1;
          aGrid := TCrackDBGrid(Sender);
            grCoord := aGrid.MouseCoord(X, Y);
            aGrid.DataSource.DataSet.DisableControls;
    
              oldActiveRecord := aGrid.DataLink.ActiveRecord; 
              newActiveRecord := grCoord.Y - aGrid.DataLink.ActiveRecord; 
    
          aGrid.DataLink.MoveBy(newActiveRecord);
          delta := aGrid.DataLink.DataSet.FieldByName('Name').AsString;
    
          if grCoord.X > 0 then
            begin
             caption := delta;
            end;
    
         aGrid.DataLink.ActiveRecord := oldActiveRecord;
         aGrid.DataSource.DataSet.EnableControls;
    
          MoveFlag := 0;
        end;
    end;
    
    
    procedure TFSprav.dsMainCatDataChange(Sender: TObject; Field: TField);
    begin
      if MoveFlag = 0 then
      begin
      qCat.Active := false;
        qCat.Parameters.ParamByName('id_MainCat').Value := dsMainCat.DataSet.FieldByName('id').AsInteger;
      qCat.Active := true;
      end;
    
    end;
    Ответ написан
  • Как сканировать на МФУ из лотка через WIA (VBA)?

    @KTG Автор вопроса
    разобрался.
    "objDev.Properties("Document Handling Select").Value = 1"
    Полностью код в комментариях к вопросу
    WIA ошибка при установке параметра PAGES (VBA). Почему?
    Ответ написан
    Комментировать
  • WIA ошибка при установке параметра PAGES (VBA). Почему?

    @KTG Автор вопроса
    Вот кстати полностью рабочий код, который делает то, что от него требуется.
    Сканирует без диалога все листы из автоподатчика, пока не вывалиться ошибка Err.Number -2145320957.
    Затем все конвертирует в TIFF и сохраняет в один многостраничный документ.

    Sub scan()
        
        Dim objDM As WIA.DeviceManager
        'MsgBox (Split(ActiveCell.Address, "$")(1))
            Dim objDev As WIA.Device
            
                Dim objItem As WIA.Item
                Dim objImage, FirstImage As WIA.ImageFile
                Dim objIP As WIA.ImageProcess
            
            Dim s As String
            Dim i, num As Integer
          
         Set objDM = New WIA.DeviceManager
         For i = 1 To objDM.DeviceInfos.Count
            If objDM.DeviceInfos(i).Type = 1 Then
              s = objDM.DeviceInfos(i).DeviceID
            End If
         Next
         
         Set objDev = objDM.DeviceInfos(s).Connect
         If objDev Is Nothing Then
            MsgBox ("Error: Not device found")
         Else
    
            objDev.Properties("Document Handling Select").Value = 1
            objDev.Properties("Pages").Value = 1
         
            Set objItem = objDev.Items(1)
         
                Set objImage = New WIA.ImageFile
                Set objIP = New WIA.ImageProcess
                
    ScanStart:
    
            On Error GoTo ScanError
                
                Set objImage = objItem.Transfer("{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}")
                num = num + 1
                If num = 1 Then
                    Set FirstImage = objImage
                Else
                    objIP.Filters.Add (objIP.FilterInfos("Frame").FilterID)
                    objIP.Filters(objIP.Filters.Count).Properties("ImageFile") = objImage
                    objIP.Filters(objIP.Filters.Count).Properties("FrameIndex") = objIP.Filters.Count
                End If
    
            GoTo ScanStart
            
    ScanError:
    
            Select Case Err.Number
                Case -2145320957
                    MsgBox ("No More Pages Found")
    
                    objIP.Filters.Add (objIP.FilterInfos("Convert").FilterID)
                    objIP.Filters(objIP.Filters.Count).Properties("FormatID") = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
                    Set FirstImage = objIP.Apply(FirstImage)
                    FirstImage.SaveFile "c:\test\" & ActiveCell.Value & num & ".TIFF"
                Case Else
                    MsgBox ("Error: " & Err.Description & "(" & Err.Number & ")")
            End Select
            
            Set FirstImage = Nothing
            Set objItem = Nothing
            Set objImage = Nothing
            Set objDev = Nothing
         End If
         
         Set objDev = Nothing
         Set objDM = Nothing
        
    End Sub
    Ответ написан
    4 комментария
  • Возможно ли написать скрипт сканирования для Excel 2010?

    @KTG Автор вопроса
    Разобрался.
    Повесил кнопку, написал обработчик вызывающий сканирование.
    Следующим шагом нужно сделать многостраничное сканирование, т.е. если нужно несколько сканов сохранить в один документ.
    PDF или многостраничный TIF.
    PDF видимо не подойдет, т.к. придется таскать за собой внешнюю библиотеку для создания PDF?
    А в случае с файлами xlsm формата (Excel c макросами) это не совсем удобно.
    Ответ написан
    Комментировать
  • Как строится доказательство этого примера?

    @KTG Автор вопроса
    Вопрос отпал, половина решения в учебнике было съедено, как само собой разумеющееся.
    Для понимания можно было бы сначала показать преобразованную правую часть, затем уже выводить левую. Тогда бы все сошлось без вопросов.

    Для закрепления материала, может кто подскажет задачу на реальном примере? Что бы не слишком углубляться в логические рассуждения, но применить метод математической индукции.
    Ответ написан
    Комментировать
  • Что учить после html5, css3, javascript?

    @KTG
    Прочитать про работу с DOM, если не захватили тему при изучении JavaScript.
    Освоить jQuery как довесок к тому же JS.
    Понять работу с Ajax. Сейчас активно используется асинхронные механизмы обмена данными.

    Если сочтете нужным на этом остановиться, то дальше фреймворки, которые помогут облегчит работу.
    Взглянуть на JS библиотеки для работы с CSS.

    Если двигаться в сторону конвейерной разработки, то освоить любую CMS. Их не так много распространенных.. DLE, Drupal, Joomla, TYPO3

    Если идти в программирование то возможно Node.Js или Java.
    Ответ написан
    Комментировать