Скопируйте SQL-оператор, используя VBA - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь вставить скопированные идентификаторы в скобки оператора SQL - конечная цель - получить полный оператор SQL с идентификаторами в буфере обмена.Мой текущий подход заключается в следующем:

1) переберите идентификатор до последней строки и добавьте «,» для каждого идентификатора, если только он не последний.

2)после форматированных идентификаторов с "," на лист "Sql Format" и скопировать результат в буфер обмена

ПРИМЕЧАНИЕ: я не хочу, чтобы вставить идентификаторы на лист, если этоможно как-то пропустить, это было бы здорово, но не обязательно.

Как / где я могу сохранить оператор Sql и указать макросу скопированные идентификаторы между скобками, а затем скопировать весь обновленный оператор?

VBA:

Sub QueryFormat()
  Dim Lastrow As Long, i As Long
    Dim ws As Worksheet
    Dim OracleQuery As String

    Set ws = Sheets("File") 'from here I copy the Id's
    Set sq = Sheets("Sql format") 'past here the Id's with ","
    Set fl = Sheets("main") ' here is my button for macro


    Lastrow = ws.Range("A" & Rows.Count).End(xlUp).Row

    With ws
        For i = 2 To Lastrow
            If Len(Trim(.Range("A" & i).Value)) <> 0 Then _
            sq.Range("A" & i).Formula = .Range("A" & i) & ","
        If i = Lastrow Then _
        sq.Range("A" & i).Formula = .Range("A" & i)
        Next i
        sq.Range("A1:A" & i).Copy
      'Copy to clipboard the required format for the SQL query
    End With

SQL-оператор:

SELECT x.PERSON_ID,
       x.FULL_NAME,
       x.CURRENT_EMPLOYEE_FLAG,
       (SELECT xxx.full_name
          FROM per_people_x xxx
         WHERE xxx.PERSON_ID = xx.SUPERVISOR_ID) SUPERVISOR,
       (SELECT ppos.actual_termination_date
          FROM per_periods_of_service ppos
         WHERE ppos.period_of_service_id = xx.period_of_service_id
           AND ppos.actual_termination_date < trunc(SYSDATE)) Termination_Date,
       (SELECT trunc(ppos.last_update_date)
          FROM per_periods_of_service ppos
         WHERE ppos.period_of_service_id = xx.period_of_service_id
           AND ppos.actual_termination_date < trunc(SYSDATE)) Last_Update_Date
  FROM per_people_x x, per_all_assignments_f xx
WHERE x.PERSON_ID IN ()
   AND x.PERSON_ID = xx.PERSON_ID
   AND xx.PRIMARY_FLAG = 'Y'
   AND xx.ASSIGNMENT_TYPE = 'E'
   AND xx.effective_start_date =
       (SELECT MAX(f.effective_start_date)
          FROM per_all_assignments_f f
         WHERE f.person_id = xx.person_id
           AND f.primary_flag = 'Y'
           AND f.assignment_type = 'E')

Идентификатор должен идти между скобками:

ГДЕ x.PERSON_ID IN ()

С уважением, Слава

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

После постоянных кровотечений из моих глаз, пытаясь решить эту проблему, я наконец нашел решение: 1) Скопируйте + прошлые идентификаторы из Sheet1 в (Sheet2, (A2)), добавив «,» для каждой строки, кроме последней (так что SQL-запрос будет работать); 2) Store In Sheet2 (A1) Первая часть запроса - должна быть одна строка без пробелов и текстовый формат 3) Найти последнюю строку с идентификатором и пропустить вторую часть запроса SQL; 4) Скопируйте диапазон в Sheet2 A1: A (Lastrow) на клипборд, чтобы быть готовым к использованию.

    Sub PlSqlQueryFormat()

        Dim Lastrow As Long, i As Long
        Dim ws As Worksheet
        Dim OracleQuery As String


        Set ws = Sheets("File") 'Source with plain Id's
        Set sq = Sheets("Sql format") 'Destination to past the Adjusted Id's
        Set fl = Sheets("main") 'My main UI with buttons & Instructions


        Lastrow = ws.Range("A" & Rows.Count).End(xlUp).Row
     Application.ScreenUpdating = False
        With ws
            For i = 2 To Lastrow 'It starts with 2 because I don't want to start from header in A1
                If Len(Trim(.Range("A" & i).Value)) <> 0 Then _
                sq.Range("A" & i).Formula = .Range("A" & i) & "," 'If there is Value AKA ID, add ","
            If i = Lastrow Then _
            sq.Range("A" & i).Formula = .Range("A" & i) 'If the ID is the last raw DONT add "," - just copy as is
            Next i

          'Copy to clipboard the required format for the SQL query
          Dim Ne As Long
       Ne = sq.Cells(Rows.Count, "A").End(xlUp).Row + 1 'searching for last row to past the second part of the query after the last ID
       sq.Cells(Ne, "A").Value = sq.Range("B1").Value ' B1=Second part of the query

        sq.Range("A1:A" & i).Copy ' copy the whole range with the Query and the Id's inside the query

        End With
        MsgBox "PlSql Query was successfully copied "

      '  fl.Range("D7") = "Done" 'Message text in cel AFTER: 1)Format is made & 2)Copied to clipboard
         Application.ScreenUpdating = True
End Sub

Надеюсь, это поможет кому-то с подобной задачей в будущем.

С уважением, Слава

0 голосов
/ 06 июля 2018

Хранение идентификаторов в таблице упрощает обращение к ним

  Range("Table1[ID]")

enter image description here

enter image description here

Затем вы можете использовать VBA.Join() или WorksheetFunction.TextJoin() для переноса идентификаторов.

  Chr(34) & Join(WorksheetFunction.Transpose( Range("Table1[ID]") ), Chr(34) & "," & Chr(34)) & Chr(34)

  Chr(34) & WorksheetFunction.TextJoin( Chr(34) & "," & Chr(34),True, Range("Table1[ID]")) & Chr(34)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...