מיטוב

MrProg

New member
מיטוב

אני מתכנן יישום שחייב להפעיל הרבה מאוד שאילתות משתנות לדוגמה אנשים רק מאזור מסויים, אנשים מעל גיל מסויים וכדו´ איך כדאי לי לבנות את השאילתה כך שהשינויים בה יהיו מזעריים בכל פעם
 
בצורה של שרשור....

למשל:
" WHERE " TBL.[Fld] = " & Integer & " AND TBL.StringFLD = ´" & String & "´ OR TBL.DateFld = # " & Date & " # "​
אני חושב שהרעיון ברור. אגב, אני כבר שרשרתי שמות של שדות וערך להשוואה וזה עבד. שבת שלום
 

MrProg

New member
תגובתי

השאילתות שהתוכנה יוצרת משתנים לעיתים תכופות לדוגמה בהפעלה הראשונית יש לשאילתא 2 פרמטרים (כל האנשים מעל גיל 60 מאזור ת"א) ואילו בהפעלה השניה יהיו יותר פרמטרים כך שבשרשור אני מחוייב לבנות כל פעם את השאילתא מחדש האם אין דרך יותר טובה ? תודה מראש
 
עדיין אם אתה רוצה הדרך היא שרשור

כלומר, אז אתה הולך ברמה גבוהה יותר: " SELECT " & sSTR ומה שאתה עושה זה בקוד מכניס את שמות השדות למשתנה.... אתה יודע מה, אני אתן לך דוגמה שמתייחסת לזה. אני רק צריך למצא את זה
 
כמו שהבטחתי....

Private Sub doSQL() Dim sSQL As String ´ ביצוע שאילה לבנית הדו"ח ´ בנית שאילתה If Me![LstType].Column(0) = 5 Or Me![LstType].Column(0) = 12 Then If Len(fsValues) < 6 Then sSQL = " SELECT BusTBL.BusID, BusTBL.BusName, CountStationQuery.[stationnumber], CountStationQuery.[stationname], CountStationQuery.order, CountStationQuery.snumber " _ & " FROM BusTBL LEFT JOIN CountStationQuery ON BusTBL.BusID = CountStationQuery.BusID " _ & fsSort Me![TxtTotal] = Nz(DCount("[number]", "details"), 0) Else sSQL = " SELECT BusTBL.BusID, BusTBL.BusName, CountStationQuery.[stationnumber], CountStationQuery.[stationname], CountStationQuery.order, CountStationQuery.snumber " _ & " FROM BusTBL LEFT JOIN CountStationQuery ON BusTBL.BusID = CountStationQuery.BusID " _ & " WHERE (((BusTBL.BusID) " & fsValues & ")) " _ & fsSort Me![TxtTotal] = Nz(DCount("[number]", "details", "[busid] " & fsValues), 0) End If Else sSQL = " SELECT details.Number, details.name, details.adress, details.[stationnumber], details.class, details.[hometel], details.[worktel], details.selection, details.[workplace], details.group, details.BusID, station.order, station.[stationname] " _ & " FROM details LEFT JOIN station ON (details.[stationnumber] = station.[stationnumber]) AND (details.BusID = station.BusID) " _ & fsFilter & " " _ & fsSort End If Me![TxtSql] = sSQL End Sub Private Function fsValues() As String Dim iCurrRow As Integer ´ איסוף נתוני החיתוך fsValues = "in ( " For iCurrRow = 0 To Me![LstValue].ListCount - 1 If Me![LstValue].Selected(iCurrRow) Then fsValues = fsValues & Me![LstValue].ItemData(iCurrRow) & ", " End If Next iCurrRow fsValues = Left(fsValues, Len(fsValues) - 2) & ")" End Function Private Function fsFilter() As String ´ בנית חתך לשאילתה לדו"חות Select Case Me![CmbReport] Case 1 fsFilter = " " Case 2 fsFilter = "WHERE (((details.[stationnumber]) " Case 3 fsFilter = "WHERE (((details.BusID) " Case 4 fsFilter = " " End Select ´ בקרה שיש ערכים לסינון אחרת הצג הכל If Len(fsValues) < 6 Then fsFilter = " "​
עכשיו אם אתה משרשר קריטריון וכרגע אין לך חתך אז משתמשים ב -
like ´*´​
זה כל הסיפור
 
בצורה של שרשור....

למשל:
" WHERE TBL.[Fld] = " & Integer & " AND TBL.[StringFLD] = ´" & String & "´ OR TBL.[DateFld] = # " & Date & " # "​
אני חושב שהרעיון ברור. אגב, אני כבר שרשרתי שמות של שדות וערך להשוואה וזה עבד. שבת שלום
 

yossin

New member
שאלה משלימה

כאשר אני משתמש בשיטת השירשור, מה אם אחד השדות נשאר ריק על ידי המשתמש ? למשל- הוא לא הכניס גיל. העברת שירשור של where age between ([gil_from],[gil_to]) לא תביא שום תועלת איך לעקוף את זה באופן הכי פשוט ונכון ?
 
למעלה