דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תוכנה
  3. שליפת רשומה רנדומאלית באקסס

שליפת רשומה רנדומאלית באקסס

מתוזמן נעוץ נעול הועבר תוכנה
20 פוסטים 6 כותבים 437 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • מלאמ מנותק
    מלאמ מנותק
    מלא
    השיב לspider ב נערך לאחרונה על ידי
    #11

    @spider
    כמובן.

    תנסה את זה:

    dlookup("עמודהשם", "טבלה", "עמודהID=" &  Int((DMAX("עמודהID","טבלה")  - 1 + 1) * Rnd + 1))
    

    זה בהנחה שכל המספרים מלאים והמספור מתחיל ב1, אם יש מספרים ריקים, לפעמים הוא לא יחזיר כלום.

    https://www.techonthenet.com/access/functions/numeric/rnd.php

    תגובה 1 תגובה אחרונה
    2
    • מלאמ מנותק
      מלאמ מנותק
      מלא
      השיב לspider ב נערך לאחרונה על ידי
      #12
      פוסט זה נמחק!
      תגובה 1 תגובה אחרונה
      0
      • OdedDvirO מנותק
        OdedDvirO מנותק
        OdedDvir
        כתב ב נערך לאחרונה על ידי
        #13

        @spider לאקסס אין מנגנון מובנה לשליפת רשומה אקראית, אבל מייקרוסופט הואילו בטובם לספק קוד שכזה.
        צור מודל חדש ותדביק בו את הקוד הבא:

        Public Function FindRandom(RecordSetName As String, Fieldname As String) 
         
         Dim MyDB As Database 
         Dim MyRS As Recordset 
         Dim SpecificRecord As Long, i As Long, NumOfRecords As Long 
         
         Set MyDB = CurrentDB() 
         Set MyRS = MyDB.OpenRecordset(RecordSetName, dbOpenDynaset) 
         On Error GoTo NoRecords 
         MyRS.MoveLast 
         NumOfRecords = MyRS.RecordCount 
         SpecificRecord = Int(NumOfRecords * Rnd) 
         If SpecificRecord = NumOfRecords Then 
           SpecificRecord = SpecificRecord - 1 
         End If 
         MyRS.MoveFirst 
         For i = 1 To SpecificRecord 
           MyRS.MoveNext 
         Next i 
         FindRandom = MyRS(Fieldname) 
         Exit Function 
         
        NoRecords: 
         If Err = 3021 Then 
           MsgBox "There Are No Records In The Dynaset", 16, "Error" 
         Else 
           MsgBox "Error - " & Err & Chr$(13) & Chr$(10) & Error, _ 
             16, "Error" 
         End If 
         FindRandom = "No Records" 
         Exit Function 
         
        End Function 
        

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

        =FindRandom("שם_הטבלה_שלך","שם_השדה_הרצוי")
        
        dovidD תגובה 1 תגובה אחרונה
        6
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          השיב לOdedDvir ב נערך לאחרונה על ידי
          #14

          @OdedDvir אפשר ע"י שאילתה שממיינת לפי מספר אקראי ולוקחת את הראשון (SELECT TOP 1).
          https://stackoverflow.com/a/35457559/1271037
          אבל מבחינת ביצועים הקוד שלך הרבה יותר טוב.

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          dovidD תגובה 1 תגובה אחרונה
          4
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            השיב לdovid ב נערך לאחרונה על ידי
            #15

            @dovid אמר בשליפת רשומה רנדומאלית באקסס:

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

            אני כבר לא בטוח, אני רואה שגם בקוד שלהם יש מעבר על כל השורות, בשביל מה?
            אי אפשר לגשת למשפר השורות בלי MoveLast? ולמה MyRS.MoveNext בלולאה, אין פקודה לנוע מספר נתון ישירות?

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            מלאמ OdedDvirO WWWW 3 תגובות תגובה אחרונה
            0
            • מלאמ מנותק
              מלאמ מנותק
              מלא
              השיב לdovid ב נערך לאחרונה על ידי מלא
              #16

              @dovid אמר בשליפת רשומה רנדומאלית באקסס:

              אי אפשר לגשת למשפר השורות בלי MoveLast?

              https://docs.microsoft.com/en-us/office/vba/access/concepts/data-access-objects/count-the-number-of-records-in-a-dao-recordset
              ככה הם אומרים.
              http://www.baldyweb.com/RecordCounts.htm

              ולמה MyRS.MoveNext בלולאה, אין פקודה לנוע מספר נתון ישירות?

              כן יש, rs.move 10
              שאלות, על המדריך שם..

              תגובה 1 תגובה אחרונה
              1
              • OdedDvirO מנותק
                OdedDvirO מנותק
                OdedDvir
                השיב לdovid ב נערך לאחרונה על ידי
                #17

                @dovid האמת היא שלא טרחתי אפילו לעבור על הקוד, פשוט העתק הדבק ממיקרוסופט.
                אבל בודאי שעדיף לקפוץ ישירות לרשומה הרצויה על ידי Move. בנוסף, מצאתי טעות בקוד שלהם, חסרה להם MoveFirst אחרי הפקודה MyRS.MoveLast (משום מה לא מופיעים מספרי שורות לעיל)
                וגם הצהרה מפורשת שמדובר ב DAO.Recordset (זה כנראה קוד ישן מאוד...)
                להלן הפונקציה המשופרת:

                Public Function FindRandom(RecordSetName As String, Fieldname As String)
                 
                    Dim MyDB As DAO.Database
                    Dim MyRS As DAO.Recordset
                    Dim SpecificRecord As Long, i As Long, NumOfRecords As Long
                 
                    Set MyDB = CurrentDb()
                    Set MyRS = MyDB.OpenRecordset(RecordSetName, dbOpenDynaset)
                    On Error GoTo NoRecords
                    MyRS.MoveLast
                    NumOfRecords = MyRS.RecordCount
                    SpecificRecord = Int(NumOfRecords * Rnd)
                    If SpecificRecord = NumOfRecords Then
                        SpecificRecord = SpecificRecord - 1
                    End If
                    MyRS.MoveFirst
                    MyRS.Move SpecificRecord
                
                    FindRandom = MyRS(Fieldname)
                    Exit Function
                 
                NoRecords:
                    If Err = 3021 Then
                        MsgBox "There Are No Records In The Dynaset", 16, "Error"
                    Else
                        MsgBox "Error - " & Err & Chr$(13) & Chr$(10) & Error, _
                                                                      16, "Error"
                    End If
                    FindRandom = "No Records"
                    Exit Function
                 
                End Function
                

                במחשבה שניה אפשר לוותר גם על MoveFirst לחלוטין ופשוט לזוז אחורה מספר רנדומלי, כך:

                ' MyRS.MoveFirst
                 MyRS.Move -SpecificRecord
                
                S תגובה 1 תגובה אחרונה
                3
                • WWWW מנותק
                  WWWW מנותק
                  WWW
                  השיב לdovid ב נערך לאחרונה על ידי
                  #18

                  @dovid אמר בשליפת רשומה רנדומאלית באקסס:

                  @dovid אמר בשליפת רשומה רנדומאלית באקסס:
                  אי אפשר לגשת למשפר השורות בלי MoveLast?

                  אי אפשר, וגם ככה צריך רחמים גדולים, כי המספר לא מדוייק, לא ברור למה.

                  WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                  תגובה 1 תגובה אחרונה
                  0
                  • S מנותק
                    S מנותק
                    spider
                    השיב לOdedDvir ב נערך לאחרונה על ידי
                    #19

                    @OdedDvir דבר ראשון תודה ענקית הקוד עזר לי מאוד!!!

                    למה כל פעם כשאני פותח את הטופס, שאליו מוזן הרשומה רנדומאלית, מוצגת לי ההודעה הבאב:
                    3576d6ab-a185-4da7-a864-da965d846edc-image.png

                    dovid123123@gmail.com

                    OdedDvirO תגובה 1 תגובה אחרונה
                    0
                    • OdedDvirO מנותק
                      OdedDvirO מנותק
                      OdedDvir
                      השיב לspider ב נערך לאחרונה על ידי
                      #20

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

                          Set MyRS = MyDB.OpenRecordset(RecordSetName, dbOpenDynaset)
                      

                      לשורה הבאה:

                          Set MyRS = MyDB.OpenRecordset(RecordSetName, dbReadOnly, dbOpenSnapshot)
                      
                      תגובה 1 תגובה אחרונה
                      2

                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום