עזרה באקסס רשימה לפקד משולב

Aיוסי

משתמש רשום
יש לי פקד משולב עם רשימה כזו
אבא
אמא

איך אני עושה שאם כותבים "בא" הוא יציע אבא ולא רק אם כותבים מתחילת המילה?
 

ארי4791

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

ארי4791

משתמש צעיר
יש כאן קובץ שפעם פורסם כאן בפורום.
אני לא זוכר למי מגיע הקרדיט....
 

קבצים מצורפים

  • חיפוש מתקדם.rar
    KB 27 · צפיות: 36

אפר

סתם מתעניין...
מנוי פרימיום
מעודכן:

יש ליצור מודול מחלקה עם הקוד הבא:
קוד:
Option Compare Database
Option Explicit

Private Direction As Boolean

Public Function ChipushShinuy()
    On Error Resume Next
    If Direction Then
        Direction = False
    Else
        Screen.ActiveControl.Tag = Screen.ActiveControl.Text
        Screen.ActiveControl.RowSource = Screen.ActiveControl.RowSource
        Screen.ActiveControl.Dropdown
    End If
End Function

Public Function ChipushGotFocus()
    On Error Resume Next
    Screen.ActiveControl.Tag = ""
    Direction = False
    Screen.ActiveControl.RowSource = Screen.ActiveControl.RowSource
End Function

Public Function ChipushKeyUp(KeyCode As Integer)
    On Error Resume Next
    If KeyCode = 38 Or KeyCode = 40 Then Direction = True
End Function

Public Function ChipushKeyDown(KeyCode As Integer)
    On Error Resume Next
    If KeyCode = 38 Or KeyCode = 40 Then Direction = True
End Function

Public Function ChipushNotInList()
    On Error Resume Next
    Dim Sql As Recordset
    Set Sql = CurrentDb.OpenRecordset(Screen.ActiveControl.RowSource)
    ChipushNotInList = Sql(Screen.ActiveControl.BoundColumn - 1)
    Set Sql = Nothing
End Function
במודול נוסף:
קוד:
Option Compare Database
Option Explicit

Public Function Chipush() As String
    On Error Resume Next
    Chipush = Screen.ActiveControl.Tag
End Function
לאחר מכן בכל פקד שרוצים להכניס מכניסים בשאילתת מקור השורה את התנאי הבא בעמודה המתאימה :
קוד:
ALike "%" & Chipush() & "%"

יש להגדיר הרחב אוטומטית ללא

לאחר מכן לגשת לVBA
:
צריך לתת שם למודול הארוך (אני נתתי לדוג' clsChipush)
צריך לתת שם לכל פעם שמשתמשים לפקד (בדוג' Shem)
בחלק העליון של המודול של הטופס להוסיף
קוד:
private <<שם באנגלית>> as <<שם המודול הארוך>>
דוג'
private Shem as clsChipush

ובעת טעינה של הטופס להוסיף
קוד:
set <<השם באנגלית>> = new <<שם המודול הארוך>>
דוג'
set Shem = new clsChipush

לאחר מכן יש להכניס באירועים של התיבה המשולבת את הפונקציות כדלהלן:

בעת שינוי:
קוד:
<<השם באנגלית>>.ChipushShinuy
בעת קבלת מוקד:
קוד:
<<השם באנגלית>>.ChipushGotFocus
בעת ירידת מקש:
קוד:
<<השם באנגלית>>.ChipushKeyDown KeyCode
בעת עליית מקש:
קוד:
<<השם באנגלית>>.ChipushKeyUp KeyCode
בעת שלא ברשימה:
קוד:
On Error Resume Next
Response = 0
Me.ActiveControl = <<השם באנגלית>>.ChipushNotInList
<<שם הפקד>>_AfterUpdate
במקרה הצורך בלבד להכניס את שורת הפקד לאחר עדכון
 
נערך לאחרונה ב:

Aיוסי

משתמש רשום
@אפר הכנסתי וזה מה שאני מקבל
ושגיאה בפתיחת הטופס
1645440489499.png
 

Aיוסי

משתמש רשום
@אפר עכשיו ניסיתי לעשות כך
1645442795835.png

אבל אחרי כל אות שאני מקליד נסגרת הרשימה וקופצת הודעת שגיאה (אני מקיש אנד, וממשיך וזה עובד)
 

אפר

סתם מתעניין...
מנוי פרימיום
שכחתי שני חלקים נוספים

צריך לתת שם למודול הארוך (אני נתתי לדוג' clsChipush)
צריך לתת שם לכל פעם שמשתמשים לפקד (בדוג' Shem)
בחלק העליון של המודול של הטופס להוסיף
קוד:
private <<שם באנגלית>> as <<שם המודול הארוך>>
דוג'
private Shem as clsChipush

ובעת טעינה של הטופס להוסיף
קוד:
set <<השם באנגלית>> = new <<שם המודול הארוך>>
דוג'
set Shem = new clsChipush
 

Aיוסי

משתמש רשום
לסיכום ערכתי את הפוסט המקורי
עכשיו אמור לעבוד חלק

לא כתבתי את זה מספיק אחיד וברור בתחילה
זה הקוד בטופס
קוד:
Option Compare Database
Private Shem As AutoComplete1


Private Sub cboCity_AfterUpdate()
    DoCmd.Save acForm, "XYZ"
    DoCmd.RefreshRecord
End Sub

Private Sub cboCity_Change()
    Shem.ChipushShinuy
End Sub

Private Sub cboCity_GotFocus()
    Shem.ChipushGotFocus
End Sub

Private Sub cboCity_KeyDown(KeyCode As Integer, Shift As Integer)
    Shem.ChipushKeyDown KeyCode
End Sub

Private Sub cboCity_KeyUp(KeyCode As Integer, Shift As Integer)
    Shem.ChipushKeyUp KeyCode
End Sub

Private Sub cboCity_NotInList(NewData As String, Response As Integer)
On Error Resume Next
Response = 0
Me.ActiveControl = Shem.ChipushNotInList
cboCity_AfterUpdate
End Sub

Private Sub Form_Load()
 Set Shem = New AutoComplete1
End Sub
וזה מקפיץ שגיאה
1645447690706.png


אולי צריך לשנות משהו גם במודולים עצמם?
 

אפר

סתם מתעניין...
מנוי פרימיום
זה הקוד בטופס
קוד:
Option Compare Database
Private Shem As AutoComplete1


Private Sub cboCity_AfterUpdate()
    DoCmd.Save acForm, "XYZ"
    DoCmd.RefreshRecord
End Sub

Private Sub cboCity_Change()
    Shem.ChipushShinuy
End Sub

Private Sub cboCity_GotFocus()
    Shem.ChipushGotFocus
End Sub

Private Sub cboCity_KeyDown(KeyCode As Integer, Shift As Integer)
    Shem.ChipushKeyDown KeyCode
End Sub

Private Sub cboCity_KeyUp(KeyCode As Integer, Shift As Integer)
    Shem.ChipushKeyUp KeyCode
End Sub

Private Sub cboCity_NotInList(NewData As String, Response As Integer)
On Error Resume Next
Response = 0
Me.ActiveControl = Shem.ChipushNotInList
cboCity_AfterUpdate
End Sub

Private Sub Form_Load()
 Set Shem = New AutoComplete1
End Sub
וזה מקפיץ שגיאה
צפה בקובץ המצורף 1069669

אולי צריך לשנות משהו גם במודולים עצמם?
AutoComplete1 זה השם של המודל הארוך? (אם לא אז תחליף)
 

Aיוסי

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

אפר

סתם מתעניין...
מנוי פרימיום
@אפר עכשיו אני רואה באג חדש, שאם אני כותב צירוף אותיות שלא מופיע בכלל במקור השורה, זה פשוט נתקע ושולח לדיבוג בעורך קוד..
איך אפשר לסדר את זה שלא ישתגע עם הצירוף שהזנתי בשדה לא מתאים כלל?
באופן עקרוני זה כבר מטופל אם הכנסת בעת שלא ברשימה
תבדוק שמופיע [פרוצדורת אירוע] בעת שלא ברשימה
 

Aיוסי

משתמש רשום
הכנסתי את זה בבעת שלא ברשימה, ולא עובד:
קוד:
Private Sub cboxyz_NotInList(NewData As String, Response As Integer)
On Error Resume Next
Response = 0
Me.ActiveControl = Shem.ChipushNotInList
cboxyz_AfterUpdate
End Sub
יכול להיות שהשורה הזו cboxyz_AfterUpdate צריכה להיות פקד אחר?
 
נערך לאחרונה ב:

אפר

סתם מתעניין...
מנוי פרימיום
הכנסתי את זה בבעת שלא ברשימה, ולא עובד:
קוד:
Private Sub cboxyz_NotInList(NewData As String, Response As Integer)
On Error Resume Next
Response = 0
Me.ActiveControl = Shem.ChipushNotInList
cboxyz_AfterUpdate
End Sub
יכול להיות שהשורה הזו cboxyz_AfterUpdate צריכה להיות פקד אחר?
כתבתי שאם לא קיים קוד לאחר עדכון לא לכתוב את השורה הזו
אם זו לא הבעיה תראה לי מה השורה שבה נתקע הקוד
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קלז

א עַל נַהֲרוֹת בָּבֶל שָׁם יָשַׁבְנוּ גַּם בָּכִינוּ בְּזָכְרֵנוּ אֶת צִיּוֹן:ב עַל עֲרָבִים בְּתוֹכָהּ תָּלִינוּ כִּנֹּרוֹתֵינוּ:ג כִּי שָׁם שְׁאֵלוּנוּ שׁוֹבֵינוּ דִּבְרֵי שִׁיר וְתוֹלָלֵינוּ שִׂמְחָה שִׁירוּ לָנוּ מִשִּׁיר צִיּוֹן:ד אֵיךְ נָשִׁיר אֶת שִׁיר יְהוָה עַל אַדְמַת נֵכָר:ה אִם אֶשְׁכָּחֵךְ יְרוּשָׁלִָם תִּשְׁכַּח יְמִינִי:ו תִּדְבַּק לְשׁוֹנִי לְחִכִּי אִם לֹא אֶזְכְּרֵכִי אִם לֹא אַעֲלֶה אֶת יְרוּשָׁלִַם עַל רֹאשׁ שִׂמְחָתִי:ז זְכֹר יְהוָה לִבְנֵי אֱדוֹם אֵת יוֹם יְרוּשָׁלִָם הָאֹמְרִים עָרוּ עָרוּ עַד הַיְסוֹד בָּהּ:ח בַּת בָּבֶל הַשְּׁדוּדָה אַשְׁרֵי שֶׁיְשַׁלֶּם לָךְ אֶת גְּמוּלֵךְ שֶׁגָּמַלְתְּ לָנוּ:ט אַשְׁרֵי שֶׁיֹּאחֵז וְנִפֵּץ אֶת עֹלָלַיִךְ אֶל הַסָּלַע:
נקרא  10  פעמים

לוח מודעות

למעלה