Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 63550 Skopiuj do schowka kryteria w zapytaniu do bazy sql
Autor Wiadomość
malya 
Fan Excela


Posty: 82
Wysłany: 19-12-2018, 13:03   kryteria w zapytaniu do bazy sql

Cześć,

Często dostaje raporty/zestawienia do których potrzebuje dodać swoje dane i mogę to zrobić pobierając je z bazy SQL. Mam zapytanie, które działa ale ograniczone jest ilością linii/kodów. W tej chwili działa to w ten sposób, że oryginalnie w kolumnie A mam wszystkie kody. Łącze je w jedną komórkę, rozdzielając przecinkiem i tej komórki używam jako zmiennej "kody" podstawiając ją jako jeden z warunków do wyszukania w bazie

Kod:
KODY = Range("b2").Value

ActiveWorkbook.Worksheets.Add
ActiveSheet.Name = "nsrv"

With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "ODBC;DSN=I350EURO;UID=internat;;", Destination:=Range("$A$1")).QueryTable
        .CommandText = Array( _
        "SELECT INCIDENT_PDV.IPDV_DATE_TRAIT, INCIDENT_PDV.IPDV_C_ITM8, INCIDENT_PDV.IPDV_C_CLI, INCIDENT_PDV.IPDV_NB_COLIS_DEM, INCIDENT_PDV.IPDV_NB_COLIS_SERV" & Chr(13) & "" & Chr(10) & "FROM S354LOGI.INCI" _
        , _
        "DENT_PDV INCIDENT_PDV" & Chr(13) & "" & Chr(10) & "WHERE INCIDENT_PDV.IPDV_DATE_TRAIT={ts '" & Format(Date, "yyyy-mm-dd") & " 00:00:00'} AND INCIDENT_PDV.IPDV_C_ITM8 in (" & KODY & ")")


Niestety to rozwiązanie jest ograniczone do około 14, 15 kodów, w zależności od ilości znaków w każdym kodzie (około 144 znaki)

W jaki sposób mogę to inaczej pobrać?
ID posta: 358741 Skopiuj do schowka
 
 
Tajan


Pomógł: 4243 razy
Posty: 9445
Wysłany: 19-12-2018, 14:53   

A jaka byłaby długość ciągu dla wszystkich kodów? Ogólnie mówiąc, długość ciągu każdego elementu tablicy przypisywanej do CommandText nie może być większa niż 255 znaków. Można zatem ciąg składający się z kodów umieść w oddzielnym elemencie tablicy:
Kod:
        .CommandText = Array( _
        "SELECT INCIDENT_PDV.IPDV_DATE_TRAIT, INCIDENT_PDV.IPDV_C_ITM8, INCIDENT_PDV.IPDV_C_CLI, INCIDENT_PDV.IPDV_NB_COLIS_DEM, INCIDENT_PDV.IPDV_NB_COLIS_SERV" & Chr(13) & "" & Chr(10) & "FROM S354LOGI.INCI" _
        , _
        "DENT_PDV INCIDENT_PDV" & Chr(13) & "" & Chr(10) & "WHERE INCIDENT_PDV.IPDV_DATE_TRAIT={ts '" & Format(Date, "yyyy-mm-dd") & " 00:00:00'} AND INCIDENT_PDV.IPDV_C_ITM8 in (" _
        , _
        KODY _
        , _
        ")")
i wtedy będzie można podać ciąg o długości do 255 znaków.
ID posta: 358760 Skopiuj do schowka
 
 
malya 
Fan Excela


Posty: 82
Wysłany: 19-12-2018, 15:09   

najczarniejszy scenariusz mówi o 45 tys kodów, ale rozwiązanie do 1 tys powinno być wystarczające, każdy kod średnio 6 znaków maksymalnie 8 znaków.
ID posta: 358763 Skopiuj do schowka
 
 
Patronus 
Excel Expert



Pomógł: 557 razy
Posty: 1605
Wysłany: 19-12-2018, 15:34   

To może zamiast wymieniać je wszystkie w IN () to wrzuć je do jakiejś tabeli i zrób JOINa?
ID posta: 358771 Skopiuj do schowka
 
 
Tajan


Pomógł: 4243 razy
Posty: 9445
Wysłany: 19-12-2018, 16:28   

Przy takiej ilości kodów rozwiązanie z łączeniem ciągów zdecydowanie odpada. Można próbować jeszcze w taki sposób:
Kod:
    '...
   
    Dim wkbName As String
    Dim rngName As String
    Dim rng As Range
   
    '...
 
    Set rng = ThisWorkbook.Worksheets("Arkusz1").Range("A1:A1000")
    wkbName = ThisWorkbook.FullName
    rngName = "[" & rng.Parent.Name & "$" & rng.Address(0, 0) & "]"
       
    ' ...
             
      .CommandText = Array( _
        "SELECT INCIDENT_PDV.IPDV_DATE_TRAIT, INCIDENT_PDV.IPDV_C_ITM8, INCIDENT_PDV.IPDV_C_CLI, INCIDENT_PDV.IPDV_NB_COLIS_DEM, INCIDENT_PDV.IPDV_NB_COLIS_SERV" & Chr(13) & "" & Chr(10) & "FROM S354LOGI.INCI" _
        , _
        "DENT_PDV INCIDENT_PDV" & Chr(13) & "" & Chr(10) & "WHERE INCIDENT_PDV.IPDV_DATE_TRAIT={ts '" & Format(Date, "yyyy-mm-dd") & " 00:00:00'} AND INCIDENT_PDV.IPDV_C_ITM8 in (" _
        , _
        "SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" & wkbName & "]." & rngName & ")")
gdzie kody znajdują się kolumnie A, na arkuszu "Arkusz1" w skoroszycie z makrem. Ale nie do końca jestem pewien czy to zadziała. Przed uruchomieniem skoroszyt należy zapisać.
ID posta: 358781 Skopiuj do schowka
 
 
malya 
Fan Excela


Posty: 82
Wysłany: 19-12-2018, 23:24   

nie dawało mi to spokoju i nie wiem jak, ale działa. Wygląda na to, że zapytanie może być dłuższe niż 255 znaków, tylko wyświetlane jest 255, ale zmienna przechowuje więcej. Poniżej źródło informacji

https://www.access-progra...ad.php?t=154604

zmieniłem sposób przechowywania zmiennej, której już nie trzymam w komórce, tylko jako zmienna np. txt, niestety nadal działało tylko na kilkunastu kodach. Dopiero wpadł mi w oko kawałek kodu, gdzie zapytanie po CommandText = nie zawierało Array

finalnie ciąg zmiennej tworzę

Kod:
Dim r&, txt$
r = 2
Do While Cells(r, "a") <> ""
If r = 2 Then
txt = "'" & Cells(r, "a")
Else
txt = txt & "','" & Cells(r, "a")
End If
r = r + 1
Loop
txt = txt & "'"


a samo zapytanie jak poniżej

Kod:
ActiveWorkbook.Worksheets.Add
ActiveSheet.Name = "nsrv"

With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "ODBC;DSN=I350EURO;UID=internat;;", Destination:=Range("$A$1")).QueryTable
        .CommandText = "SELECT INCIDENT_PDV.IPDV_DATE_TRAIT, INCIDENT_PDV.IPDV_C_ITM8, INCIDENT_PDV.IPDV_C_CLI, INCIDENT_PDV.IPDV_NB_COLIS_DEM, INCIDENT_PDV.IPDV_NB_COLIS_SERV" & Chr(13) & "" & Chr(10) & "FROM S354LOGI.INCIDENT_PDV INCIDENT_PDV" & Chr(13) & "" & Chr(10) & "WHERE INCIDENT_PDV.IPDV_DATE_TRAIT >= sysdate-1 AND INCIDENT_PDV.IPDV_C_ITM8 in (" & txt & ")"


w dodatku zadziałała funkcja sysdate

przetestowane na 150 kodach każdy po 8 znaków.

Ktoś mi wyjaśni, co broiła tablica?
ID posta: 358798 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe