Программа для подготовки, планирования и управления производством

+7 (495) 545-21-83
info@vogbit.ru
Закрыть
Логин:
Пароль:


Забыли свой пароль?
Регистрация
  Войти      Регистрация

Как с помощью QueryViewer отобразить информацию по выделенным позициям

 

Как с помощью QueryViewer отобразить информацию по выделенным позициям

Сегодня опять информация для пользователей, подстраивающих TCS Производство для частных задач своего предприятия. Ранее, я уже обзорно писал про QueryViewer, а теперь приведу пример кода, иллюстрирующего как зацепиться за текущую или за выделенные записи режима, из которого происходит запуск, чтобы добыть интересующие данные.

Код
Sub FormMacro_Example2(TCSActiveModule) ' Пример 2

Call TCSApp.HideProgressMessage  

Dim RowsCount
Dim RecID
Dim QueryText
Dim i

RecID = ""
RowsCount = TCSActiveModule.SelectedRowsCount
    If RowsCount > 0 Then
        For I = 0 To RowsCount - 1 'перебираем выделенные записи
            If TCSActiveModule.GotoSelectedRow(I) Then 'позиционирование на очередную выделенную запись
                RecID =  RecID + " INSЕRT #TEMP_TABLE VALUES ( " + TCSActiveModule.Properties("ID").AsSafeString + " ); "
            End If
        Next
    Else
        RecID =  " INSЕRT #TEMP_TABLE VALUES ( " + TCSActiveModule.Properties("ID").AsSafeString + " ); "
    End If
    
QueryText = "" &_
"CRЕATE TABLE #TEMP_TABLE (ID int); " &_
" " + RecID + " " &_
"" &_
"SELЕCT * FROM V_SHOPS " &_
"INNER JOIN #TEMP_TABLE ON V_SHOPS.ID = #TEMP_TABLE.ID; " &_
"DRОP TABLE #TEMP_TABLE; "

LogObject.ScriptTimeOut = 0         

    Const FormCaption = "Пример 2 (Подразделения)" 
    Const ShowType = 1 
    Const StatusText = "Пример 1" 
    Const IsEnabledbtnQueryEditor = True           
    Const RefreshButtonVisible = True 
    Const SaveButtonVisible = True 
    Const PrintButtonVisible = True 
    Const SelectButtonVisible = True   
    Const ShowTypeButtonVisible = True   
    Const ShowGroupPanel = True 
    Const View = 0 
    Const dModule = Nothing 
    Const FormWindowState = "Normal" 
    Const Width = 800 
    Const Height = 600 

    Dim comDll   
    Set comDll = CreateObject("QueryViewer") 
    If comDll Is Nothing Then 
        Call TCSApp.ShowErrorMessage("Отсутствует или не зарегистрирована библиотека QueryViewer.dll") 
    Else 
        Call comDll.ShowViewer( tcsApp,  QueryText, FormCaption, ShowType, StatusText, IsEnabledbtnQueryEditor, RefreshButtonVisible, SaveButtonVisible, _ 
         PrintButtonVisible, SelectButtonVisible, ShowTypeButtonVisible, ShowGroupPanel, View, dModule, FormWindowState, Width, Height ) 
    End If 
    Sеt comDll = Nothing 

End Sub


Видно, что предыдущий пример усложнился несколькими строками в самом начале. Там организуется цикл по выделенным записям активного режима, в котором в переменную RecID записывается длиннющая строка с инструкциями на SQL. Каждая инструкция фактически добавляет во временную таблицу #TEMP_TABLE идентификатор записи.
В данном примере идентификатор считывается как TCSActiveModule.Properties("ID").AsSafeString, но не во всех режимах это пройдет. Лучше предварительно исследовать информацию с помощью АПИ Эксплорера.

В итоге после отработки цикла в переменной RecID содержится что-то типа такого:
Код
INSЕRT #TEMP_TABLE VALUES ( 162 );  INSЕRT #TEMP_TABLE VALUES ( 163 );  INSЕRT #TEMP_TABLE VALUES ( 164 );  INSЕRT #TEMP_TABLE VALUES ( 168 );  INSЕRT #TEMP_TABLE VALUES ( 169 );

Если пользователь ничего не выделил, то сформируется строка с идентификатором текущей записи:
Код
INSERT #TEMP_TABLE VALUЕS ( 163 );

Затем останется только добавить эту строку в запрос.

Сам запрос тоже претерпел небольшие изменения. Во-первых, сначала создается временная таблица с одним полем, куда мы запишем идентификаторы выделенных записей:
Код
CRЕATE TABLE #TEMP_TABLE (ID int);

Во-вторых, не забудем использовать INNER JOIN для отбора только необходимых данных из всего набора:
Код
INNER JOIN #TEMP_TABLE ON V_SHOPS.ID = #TEMP_TABLE.ID

В-третьих, в конце запроса надо обязательно удалить временную таблицу:
Код
DRОP TABLE #TEMP_TABLE

Строковая переменная QueryText в данном случае не прописывается статически как в предыдущем примере, а фактически создается в скрипте методом конкатенации, потому как содержит переменную часть, зависящую от выделенных строк.

В итоге в переменной содержится такой SQL-скрипт, который и передается в QueryViewer для выполнения:
Код
CRЕATE TABLE #TEMP_TABLE (ID int); INSERT #TEMP_TABLE VAL UES ( 162 );  INSERT #TEMP_TABLE VAL UES ( 163 );  INSERT #TEMP_TABLE VAL UES ( 164 );  INSERT #TEMP_TABLE VAL UES ( 168 );  INSERT #TEMP_TABLE VAL UES ( 169 );  SELECT * FRОM V_SHOPS INNER JOIN #TEMP_TABLE ON V_SHOPS.ID = #TEMP_TABLE.ID; DRОP TABLE #TEMP_TABLE;


На сегодня всё. Теперь вы можете настраивать макросы, которые будут мгновенно отображать необходимые Вам данные только по интересующим (выделенным) вас позициям.
21.07.2011 09:25:42
Здравствуйте подскажите пожалуйста можно ли добавить в QueryViewer готовый SQL запрос по типу:

Код
SEL ECT  N_ORD_NOTE, 
  N_ORDSSTART, 
  N_ORD_NAME, 
  PBL.QUANTITY AS QUANT, 
  V_COUNTERAGENTS.NAME AS CUSTOMER, 
  N_ORDREM, 
  N_ORDEND, 
  (SEL ECT DISTINCT PBPAR.PARAMETER_VALUE 
  FR OM V_PRODUCTION_BOM_PARAMETERS AS PBPAR, V_PARAMETERS 
  WHERE PBPAR.PRODUCTION_BOM_ID = PBM.ID AND PBPAR.PARAMETERS_ID = V_PARAMETERS.ID AND V_PARAMETERS.UNIQUE_CODE = 'GUID1906') AS FIN_DATE, 
 
(SEL ECT DISTINCT PBPAR.PARAMETER_VALUE 
  FR OM V_PRODUCTION_BOM_PARAMETERS AS PBPAR, V_PARAMETERS 
  WH ERE PBPAR.PRODUCTION_BOM_ID = PBM.ID AND PBPAR.PARAMETERS_ID = V_PARAMETERS.ID AND V_PARAMETERS.UNIQUE_CODE = 'GUID1906') AS FIN_DATE1, 
   
  V_PRODUCTION_BOMS_STRUCTURE.TOTAL_QUANTITY 
 
 
INTO #REZ 
FR OM (SELECT N_ORDS.N_ORD_ID, N_ORDS.COMMONTREE_ID, N_ORDS.N_ORD_NOTE, N_ORDS.N_ORD_NAME,       N_ORDS.CREATOR, N_ORDS.CREATE_DATE, N_ORDS.CHANGER, N_ORDS.CHANGE_DATE,       N_ORDS.N_ORDSSTART, N_ORDS.N_ORDEND, N_ORDS.N_ORDREM,       N_ORDS.N_ORDST_ID,       COMMONTREE.COMMONTREE_NAME,       N_ORDSUSR.N_ORDU_ACC,       NORDERS.NORDER_ID, NORDERS.NORDER_NAME FR OM N_ORDS N_ORDS    LEFT JOIN COMMONTREE COMMONTREE ON  (N_ORDS.COMMONTREE_ID = COMMONTREE.COMMONTREE_ID)    LEFT JOIN N_ORDSUSR ON N_ORDSUSR.N_ORD_ID=N_ORDS.N_ORD_ID AND N_ORDSUSR.USER_ID=1    LEFT JOIN NORDER_N_ORDS ON NORDER_N_ORDS.N_ORD_ID=N_ORDS.N_ORD_ID    LEFT JOIN NORDERS ON NORDERS.NORDER_ID=NORDER_N_ORDS.NORDER_ID  WH ERE N_ORDS.COMMONTREE_ID IN (436,440,441,449)  
) AS CQ 
  LEFT JOIN V_PRODUCTION_BOMS AS PBM ON PBM.ID = CQ.N_ORD_ID 
  LEFT JOIN V_PRODUCTION_BOMS_LIST AS PBL ON PBL.PRODUCTION_BOM_ID = PBM.ID 
  LEFT JOIN V_ORDERS AS ORD1 ON ORD1.ID = CQ.NORDER_ID 
  LEFT JOIN V_COUNTERAGENTS ON V_COUNTERAGENTS.ID = ORD1.COUNTERAGENT_ID 
  LEFT JOIN V_PRODUCTION_BOMS_STRUCTURE ON V_PRODUCTION_BOMS_STRUCTURE.PRODUCTION_BOM_ID = PBM.ID 
  LEFT JOIN V_PRODUCTION_BOM_ITEM_PAR ON V_PRODUCTION_BOM_ITEM_PAR.PRODUCTION_BOM_ITEM_ID = V_PRODUCTION_BOMS_STRUCTURE.ID 
 
; 
SELECT N_ORD_NOTE, 
 CAST(N_ORDSSTART AS DATE) AS N_ORDSSTART, 
 N_ORD_NAME, 
 QUANT, 
 CUSTOMER, 
 N_ORDREM, 
 CAST(N_ORDEND AS DATE) AS N_ORDEND, 
 FIN_DATE, 
 (CASE 
 WHEN MONTH(FIN_DATE) = 1 THEN 'Январь ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 2 THEN 'Февраль ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 3 THEN 'Март ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 4 THEN 'Апрель ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 5 THEN 'Май ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 6 THEN 'Июнь ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 7 THEN 'Июль ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 8 THEN 'Август ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 9 THEN 'Сентябрь ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 10 THEN 'Октябрь ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 11 THEN 'Ноябрь ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 WHEN MONTH(FIN_DATE) = 12 THEN 'Декабрь ' + CAST(YEAR(FIN_DATE) AS VARCHAR) + 'г.' 
 ELSE 'период не определен' 
 END) AS FIN_MONTH, 
 N_ORDEND, 
 SUM(TOTAL_QUANTITY) AS TOTAL_QUANTITY 
FR OM #REZ 
GROUP BY N_ORD_NOTE, N_ORDSSTART, N_ORD_NAME, QUANT, CUSTOMER, N_ORDREM, N_ORDEND, FIN_DATE, N_ORDEND 
ORDER BY   YEAR(FIN_DATE), MONTH(FIN_DATE), DAY(FIN_DATE) 
DR OP TABLE #REZ;


Если можно, то подскажите как это лучше сделать.