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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
OdedDvirO

OdedDvir

@OdedDvir
אודות
פוסטים
2.4k
נושאים
59
קבוצות
0
עוקבים
21
עוקב אחרי
0

פוסטים

פוסטים אחרונים הגבוה ביותר שנוי במחלוקת

  • שליחת בקשת POST UploadTextFile ל-API של ימות המשיח
    OdedDvirO OdedDvir

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


  • אקסל | דרושה נוסחה לבדיקת תקינות מס חשבון בנק
    OdedDvirO OdedDvir

    די מהר מצאתי את הפרוייקט הזה בגיטהב, מלפני שנתיים, נראה לגיטימי: https://github.com/soryy708/il-bank-account-validator. היתה רק בעיה קטנה: הוא כתוב ב-JS.

    אז בגלל שזה נראה לי דבר שימושי, או בגלל שהיה קשה לי להאמין שזה לא זמין לציבור, אולי בגלל השעה... בכל מקרה, נתתי ל ChatGPT לעשות את התרגום הראשוני ל-VB, כמובן שאח"כ הייתי צריך להוסיף ולתקן כמה דברים (חריגות אינדקסים במערכים, הוספת פונקציה במקום השמה ישירה למערך, החלפה של Integer ל-Long, ריפוד באפסים, ועוד כמה שטויות של בורות מלאכותית)
    בסופו של דבר, בדקתי את הקוד מול כמה מספרי חשבונות בנק שמפורסמים ברשת (למשל כאן) וקיבלתי תוצאה תקינה.
    אז אם אתם משתמשים בקוד, ראוי שתתנו כוכב בגיטהב לפרוייקט הנ"ל. (אין לי שום קשר אליו)
    צריך לפתוח מודול חדש ולהדביק את הקוד הבא:

    Option Explicit
    
    Function ValidateAccount(bankNumber As Long, branchNumber As Long, accountNumber As Long) As Boolean
        ' Input validation:
        If Not IsNonNegativeLong(bankNumber) Then
            ValidateAccount = False
         Exit Function
        End If
        If Not IsNonNegativeLong(branchNumber) Then
            ValidateAccount = False
         Exit Function
        End If
        If Not IsNonNegativeLong(accountNumber) Then
            ValidateAccount = False
         Exit Function
        End If
    
        ' Supported banks
        Const YAHAV As Long = 4
        Const POST As Long = 9
        Const LEUMI As Long = 10
        Const DISCOUNT As Long = 11
        Const HAPOALIM As Long = 12
        Const IGUD As Long = 13
        Const OTSAR_AHAYAL As Long = 14
        Const MERCANTILE As Long = 17
        Const MIZRAHI_TEFAHOT As Long = 20
        Const CITIBANK As Long = 22
        Const BEINLEUMI As Long = 31
        Const ARAVEI_ISRAELI As Long = 34
        Const MASAD As Long = 46
        Const POALEI_AGUDAT_ISRAEL As Long = 52
    
        ' Adjust branch number For Mizrahi Tefahot
        If bankNumber = MIZRAHI_TEFAHOT Then
            If branchNumber > 400 Then
                branchNumber = branchNumber - 400
            End If
        End If
    
        Dim accountNumberDigits() As Long
        Dim branchNumberDigits() As Long
    
        accountNumberDigits = NumberDigitsToArr(CLng(accountNumber), 9)
        branchNumberDigits = NumberDigitsToArr(CLng(branchNumber), 3)
    
        ' Account number validation
        Dim sum As Long
        Dim remainder As Long
    
        Select Case bankNumber
         Case LEUMI, IGUD, ARAVEI_ISRAELI
    
            sum = ScalarProduct(GetSubset(accountNumberDigits, 8), ToIntArray("1,10,2,3,4,5,6,7"))
            sum = sum + ScalarProduct(GetSubset(branchNumberDigits, 4), ToIntArray("8, 9, 10"))
            remainder = sum Mod 100
            ValidateAccount = ArrIncludes(ToIntArray("90, 72, 70, 60, 20"), remainder)
    
         Case YAHAV, MIZRAHI_TEFAHOT, HAPOALIM
            sum = ScalarProduct(GetSubset(accountNumberDigits, 6), ToIntArray("1, 2, 3, 4, 5, 6"))
            sum = sum + ScalarProduct(GetSubset(branchNumberDigits, 4), ToIntArray("7, 8, 9"))
            remainder = sum Mod 11
    
            Select Case bankNumber
             Case YAHAV
                ValidateAccount = ArrIncludes(ToIntArray("0, 2"), remainder)
             Case MIZRAHI_TEFAHOT
                ValidateAccount = ArrIncludes(ToIntArray("0, 2, 4"), remainder)
             Case HAPOALIM
                ValidateAccount = ArrIncludes(ToIntArray("0, 2, 4, 6"), remainder)
            End Select
    
         Case DISCOUNT, MERCANTILE, BEINLEUMI, POALEI_AGUDAT_ISRAEL
            sum = ScalarProduct(GetSubset(accountNumberDigits, 9), ToIntArray("1, 2, 3, 4, 5, 6, 7, 8, 9"))
            remainder = sum Mod 11
    
            Select Case bankNumber
             Case DISCOUNT, MERCANTILE
                ValidateAccount = ArrIncludes(ToIntArray("0, 2, 4"), remainder)
    
             Case BEINLEUMI, POALEI_AGUDAT_ISRAEL
                If ArrIncludes(ToIntArray("0, 6"), remainder) Then
                    ValidateAccount = True
                Else
                    sum = ScalarProduct(GetSubset(accountNumberDigits, 6), ToIntArray("1, 2, 3, 4, 5, 6"))
                    remainder = sum Mod 11
                    ValidateAccount = ArrIncludes(ToIntArray("0, 6"), remainder)
                End If
            End Select
    
         Case POST
            sum = ScalarProduct(GetSubset(accountNumberDigits, 9), ToIntArray("1, 2, 3, 4, 5, 6, 7, 8, 9"))
            remainder = sum Mod 10
            ValidateAccount = remainder = 0
    
         Case 54
            ' Jerusalem
            ValidateAccount = True ' wtf?
    
         Case CITIBANK
            sum = ScalarProduct(GetSubset(accountNumberDigits, 8), ToIntArray("2, 3, 4, 5, 6, 7, 2, 3"))
            ValidateAccount = (11 - sum Mod 11) = accountNumberDigits(1)
    
         Case OTSAR_AHAYAL, MASAD
            sum = ScalarProduct(GetSubset(accountNumberDigits, 6), ToIntArray("1, 2, 3, 4, 5, 6"))
            sum = sum + ScalarProduct(GetSubset(branchNumberDigits, 4), ToIntArray("7, 8, 9"))
            remainder = sum Mod 11
    
            If remainder = 0 Then
                ValidateAccount = True
            End If
    
            If bankNumber = MASAD Then
                If remainder = 2 And ArrIncludes(ToIntArray("154, 166, 178, 181, 183, 191, 192, 503, 505, 507, 515, 516, 527, 539"), branchNumber) Then
                    ValidateAccount = True
                End If
    
                sum = ScalarProduct(GetSubset(accountNumberDigits, 9), ToIntArray("1, 2, 3, 4, 5, 6, 7, 8, 9"))
                remainder = sum Mod 11
    
                If remainder = 0 Then
                    ValidateAccount = True
                Else
                    sum = ScalarProduct(GetSubset(accountNumberDigits, 6), ToIntArray("1, 2, 3, 4, 5, 6"))
                    remainder = sum Mod 11
                    ValidateAccount = remainder = 0
                End If
            End If
    
            If bankNumber = OTSAR_AHAYAL Then
                If ArrIncludes(ToIntArray("0, 2"), remainder) And ArrIncludes(ToIntArray("385, 384, 365, 347, 363, 362, 361"), branchNumber) Then
                    ValidateAccount = True
                Elseif remainder = 4 And ArrIncludes(ToIntArray("363, 362, 361"), branchNumber) Then
                    ValidateAccount = True
                Else
                    sum = ScalarProduct(GetSubset(accountNumberDigits, 9), ToIntArray("1, 2, 3, 4, 5, 6, 7, 8, 9"))
                    remainder = sum Mod 11
                    If remainder = 0 Then
                        ValidateAccount = True
                    Else
                        sum = ScalarProduct(GetSubset(accountNumberDigits, 6), ToIntArray("1, 2, 3, 4, 5, 6"))
                        remainder = sum Mod 11
                        ValidateAccount = remainder = 0
                    End If
                End If
            End If
    
        End Select
    
    End Function
    
    Function ScalarProduct(arr1() As Long, arr2() As Long) As Long
        Dim product As Long
        Dim i As Long
        Dim maxIndex As Integer
        maxIndex = UBound(arr1)
        If maxIndex > UBound(arr2) Then maxIndex = UBound(arr2)
    
            For i = 1 To maxIndex
                product = product + arr1(i) * arr2(i)
            Next i
            ScalarProduct = product
    End Function
    
    Function ArrIncludes(arr() As Long, val As Long) As Boolean
        Dim i As Long
        If Not IsEmpty(arr) Then
            For i = LBound(arr) To UBound(arr)
                If arr(i) = val Then
                    ArrIncludes = True
                 Exit Function
                End If
            Next i
        End If
    End Function
    
    Function NumberDigitsToArr(num As Long, length As Long) As Long()
        Dim digitsArray() As Long
        ReDim digitsArray(1 To length)
    
        Dim zeroPadding As Integer
        zeroPadding = length - Len(CStr(num))
    
        Dim i As Long
    
        For i = 1 To zeroPadding
            digitsArray(i) = 0
        Next i
        For i = zeroPadding + 1 To length
            digitsArray(i) = num Mod 10
            num = Int(num / 10)
        Next i
        NumberDigitsToArr = digitsArray
    End Function
    
    Function IsNonNegativeLong(num As Variant) As Boolean
        If VarType(num) = vbLong And num >= 0 Then
            IsNonNegativeLong = True
        End If
    End Function
    
    Function GetSubset(arr() As Long, count As Long) As Long()
        Dim result() As Long
        ReDim result(1 To count)
        Dim i As Long
        For i = 1 To count
            If i <= UBound(arr) Then
                result(i) = arr(i)
            End If
        Next i
        GetSubset = result
    End Function
    
    Function ToIntArray(list As String) As Long()
        Dim temp() As String
        temp = Split(list, ",")
    
        Dim result() As Long
        ReDim result(1 To UBound(temp) + 1)
    
        Dim i As Integer
    
        For i = 0 To UBound(temp)
            result(i + 1) = CLng(temp(i))
        Next i
        ToIntArray = result
    End Function
    
    
    
    

  • הפיכת אותיות למספרים באקסל
    OdedDvirO OdedDvir

    @NETZ יש דרך פשוטה בלי קוד,על ידי Word:

    1. צור טבלה עם עמודה אחת ומספר שורות כרצונך, נגיד 500.
    2. סמן את כל העמודה הראשונה, ומהתפריט למעלה, הגדר תבנית מספר חדשה:
      27451ff5-9bbd-4277-8b9d-eb77a4b01a27-תמונה.png
    3. תסיר את הנקודה אחרי האות:
      f7cb432c-179d-4d02-ab40-e74bedbeeb27-תמונה.png
      ותלחץ אישור.
    4. הרשימה מוכנה, העתק והדבק לאקסל:
      d93646eb-8cd7-41f3-ab86-5563d86b13a5-תמונה.png

  • VLOOKUP עם ערך לחיפוש משתנה, אפשרי בלי IF?
    OdedDvirO OdedDvir

    @dovid אמר בVLOOKUP עם ערך לחיפוש משתנה, אפשרי בלי IF?:

    מה זה התחביר הזה:
    (B2=J:J)?

    זו נוסחת מערך, פיצ'ר מאוד שימושי שנכנס בשנת 2018.
    הרעיון הוא שנוסחא יכולה מעתה להחזיר מערך של תוצאות, ולא רק ערך יחיד.
    הנוסחה המסויימת הזו היא להשוואה של B2 מול כל העמודה J. הערך שיוחזר הוא מערך בוליאני של השוואת B2 מול כל ערך בעמודה J.
    במקרה הזה הנוסחא לא כ"כ יעילה, כי לא צריך להשוות ממש את כל העמודה, אלא רק את 5 התאים בעלי הערך. אבל קיצרתי כדי שיהיה מובן. יותר טוב לכתוב כך:

    B2=J2:J6
    

    וכן הלאה.

    בגרסאות הראשונות של נוסחאות המערך, היה צורך להקליד אותן בצורה מתוסבכת עם Shift+Enter כמו שציין @Y-Excel-Access, והן הופיעו בשורת הנוסחא עם סוגריים מסולסלות. כיום אקסל חוסך מאיתנו את כאב הראש הזה ואפשר להקליד כמו נוסחא רגילה.

    תוכל לנסות על ידי הקלדה של הנוסחא B2=J2:J6 בתוך תא כלשהו (מחוץ לטבלה) ולראות שמתקבל מערך בוליאני.


  • VLOOKUP עם ערך לחיפוש משתנה, אפשרי בלי IF?
    OdedDvirO OdedDvir

    @Sfsf3925 אפשר לחפש על ידי MATCH בכל עמודה, ולצרף את מערכי התוצאות. לדוגמא:
    3baf651b-f7c1-45ba-9dc3-b8864a001827-תמונה.png

    הנוסחא בתא G2 היא:

    =IFERROR(INDEX(K:K,MATCH(1,(B2=J:J)+(C2=J:J)+(D2=J:J)+(E2=J:J),0)),"אין תוצאה")
    

    הסבר:

    1. INDEX מאחזר ערך מתוך עמודה לפי אינדקס.
    2. MATCH מחזיר את אינדקס הערך המבוקש בטווח.
      הערך המבוקש כאן הוא 1 (כפי שיוסבר מיד). הטווח כאן הוא חיבור של טווחים (מערכים בוליאנים), שמתקבלים על ידי השוואת העמודה של הטלפונים J:J עם מספר מסויים, כאשר B2 הוא המספר הראשון, C2 הוא המספר השני וכו'.
      החיבור הזה יצור מערך יחיד המכיל אפסים (כי חיבור של בוליאני נותן 0 או 1) מלבד האינדקס שבו נמצאה ההתאמה ובו יופיע הערך 1.
      למשל עבור השורה של אברהם (הראשונה עם הנתונים), המערך שיתקבל בסוף הוא:
    {0,0,1,0,0,0}
    

    (יש 6 איברים כי לא התעלמתי משורת הכותרת)
    ולכן הנוסחא MATCH(1,{0,0,1,0,0,0},0) תחזיר את הערך 3 לפונקציה INDEX, מה שיגרום לה לרוץ כך:

    INDEX(K:K,3)
    

    ולהחזיר את הערך: 1000.


  • אקסס למתחילים: יצירת מערכת לניהול תורמים
    OdedDvirO OdedDvir

    פרק כא: הפקת קבלות: חלק ב: עיקרון ה-DRY, מחולל הדוחות

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

    • הוא יכול להיות מאוגד לטבלה, או לא מאוגד
    • הוא יכול להכיל את רוב הפקדים שיכולים להימצא בטופס
    • יש לו מגוון של ארועים שניתן להצמיד אליהם קוד VBA
    • הוא יכול להכיל דוחות משנה

    היתרון הגדול ביצירת דוח הוא היכולת להציג נתונים בצורה נוחה להדפסה.

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

    למעשה, אין לנו שדה כתובת בטבלת התורמים עדיין, אז בואו ניצור אחד כזה:
    a91c5f1b-9053-4b90-8698-21db248f6593-תמונה.png
    כדי להציג את כל פרטי הקבלה, ניצור שאילתת צירוף.

    שלב א: יצירת שאילתת צירוף להצגת פרטי הקבלה
    ניצור שאילתה חדשה, ונוסיף את שלושת הטבלאות: קבלות, תרומות, ותורמים, למשטח העבודה, אקסס תזהה את הצירוף בין הטבלאות לפי מה שהגדרנו ביחסי הגומלין:
    0cf6a774-a7f4-4b28-8fff-53b314485730-תמונה.png
    נבחר להציג את השדות הבאים:
    a8a10fbc-525b-4be9-8212-ac4b70a8df47-תמונה.png

    הממ... עדיין חסר לי את שדה שם התורם.

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

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

    אבל רגע, זה נשמע לי מוכר...
    יש לי כבר שאילתה שעושה זאת: qryDonor_FullName.

    במקום ליצור שוב שדה מחושב, בואו ונשתמש בה.
    למה?

    עיקרון ה-DRY
    לפני כעשרים שנה, פירסמו שני מתכנתים אמריקאים את העיקרון הבא בתכנון מערכות:
    Don't Repeat Yourself (אל תחזור על עצמך) או בקיצור DRY. הנוסח הרשמי לעיקרון זה הוא:
    לכל פיסת ידע צריך להיות ייצוג יחיד, חד משמעי וסמכותי במערכת.
    במילים פשוטות, זה אומר שלא נשכפל שום חלק במערכת אלא אם כן הדבר הכרחי.

    עקרון זה נועד כדי להפחית כפילויות מיוצרות במערכת, ועל ידי כך ליצור מערכת קלה לתחזוקה, כי שינוי של גורם יחיד במערכת לא יאלץ שינויים נוספים בגורמים אחרים שאינם קשורים אליו לוגית.
    ניקח לדוגמא את המקרה שלנו:
    כרגע, שם התורם המלא מוצג לפי הסדר הבא: שם משפחה + רווח + שם התורם. נניח שבעוד שנה ירצה בעל הבית להציג את שמות התורמים המלאים בסדר הפוך, דהיינו במקום כהן אברהם – אברהם כהן וכו'.
    אם הרכבת השם המלא של התורם מבוצעת רק במקום יחיד במערכת, דהיינו בשאילתה הנ"ל, כל שעלינו לעשות הוא לשנות את הגדרת השדה המחושב שם – והשינוי ישתקף בכל מקום במערכת.
    אבל, אם בכל פעם יצרנו שוב את השדה המחושב מחדש – זה הופך לעבודת נמלים מייגעת...

    אז יופי, בואו ונוסיף גם את השאילתה למשטח העבודה, והופ – נראה שהפעם אקסס לא הייתה כל כך מבריקה, והחליטה לצרף את השדה ID מטבלת התרומות לשדה ID בשאילתה, כפי שמוצג בדרמטיות בתמונה הבאה:
    4a48265f-906b-432f-9a04-e757c837fc0b-תמונה.png

    מדוע זה קרה?
    אקסס זיהתה את שם השדה ID הזהה בשתי מקורות הנתונים, והחליטה "לעזור לנו" על ידי יצירת הצירוף עבורנו. אבל זה כמובן לא נכון!

    אם היינו קוראים לשדה המפתח בכל טבלה בשם מלא, כפי שנהגנו במפתח הזר, למשל DonationID במקום ID בטבלת התרומות, או DonorID במקום ID בטבלת התורמים וכו', המנגנון של אקסס אכן היה עוזר לנו.
    זו אכן סכמה נפוצה, ובאמת בתחילת דרכי כך נהגתי, אבל היא פחות מקובלת, ובקוד היא נעשית מסורבלת עוד יותר, כי ניגשים לשדה המזהה כך: Donor.DonorID במקום כך: Donor.ID.
    לכן אני מעדיף לוותר על העזרה של אקסס כאן, וליצור ידנית את הצירוף, תמורת הרווח של קוד ושאילתות יותר קריאים.

    בואו נתקן את הצירוף:
    נבחר את החץ ונמחק אותו על ידי הקשה על מקש Delete, ובמקום, נגרור את שדה ID מטבלת התורמים לשדה ID בשאילתת השם המלא, כך:
    c3be820d-041e-469e-818a-34c9fdd5be67-תמונה.png

    כעת נוסיף גם את השדה FullName לחגיגה:
    9594ee29-b8b9-4bb6-96de-c424a4dcef01-תמונה.png

    נעבור לתצוגת גליון נתונים כדי לראות שהכל תקין. על הדרך, בואו נוסיף עוד הודעות אישיות לתרומות של כהן אברהם:
    585505e0-d51e-4203-b1a9-25cea5f2c7c9-תמונה.png

    נשמור את השאילתה בשם: qryReceipt_Details (=פרטי קבלה)
    כעת ניתן סוף סוף לעבור לשלב יצירת הדוח.

    שלב ב: יצירת דוח עבור הקבלה
    בחרו מתפריט היצירה > עיצוב דוח:
    c281a687-0226-449e-9e4c-9543bd8db122-תמונה.png

    אקסס תייצר עבורנו דוח ריק. שימו לב שהדוח מחולק לשלושה אזורים:

    • כותרת עליונה בעמוד: חלק זה יודפס בראש כל עמוד חדש.
    • פירוט: החלק העיקרי של הדוח.
    • כותרת תחתונה בעמוד: חלק זה יודפס כמובן בתחתית כל עמוד.

    ישנם עוד חלקים נוספים שאפשר לערוך בדוח, כפי שנראה אי"ה בהמשך.

    כדי שהטופס יציג לנו את נתוני הקבלות, צריך לאגד אותו לשאילתה שיצרנו. לשם כך נבחר בפקד הדוח, על ידי לחיצה על הפינה השמאלית העליונה (בדומה לפקד טופס, זהו הפקד שנבחר אוטומטית בתצוגת עיצוב):
    51fac50f-e2ff-4ce2-be4e-bde4ce621892-תמונה.png

    כעת נלחץ על מקש F4 כדי להציג את חלונית המאפיינים, ניגש לכרטיסית הנתונים, ובמאפיין מקור רשומה נבחר את שאילתת פרטי הקבלות qryReceipt_Details:
    6cedb319-f280-4065-b8a2-e8be0977af09-תמונה.png

    נבחר מהתפריט למעלה את האפשרות: הוסף שדות קיימים כדי להציג את השדות שנמצאים בטבלה:
    1866ee58-2c3b-4401-91c1-564f44af4073-תמונה.png

    נבחר את כל השדות ונגרור אותם לתוך חלק הפירוט של הטופס:
    3d1fb473-fb2c-41a7-b4ef-9d1f63bf2fa3-תמונה.png

    נעצב את הדוח כיד הדמיון הטובה עלינו:
    b9e91abe-30d6-4b12-959b-8b101d2b5992-תמונה.png

    כשסיימנו, נבחר מתפריט העיצוב את התצוגה: הצג לפני הדפסה:
    83289bba-93cb-4b4f-9626-932534fdf7f2-תמונה.png

    כדי לראות את התוצאה:
    6cefd1e6-57e7-4ac0-b29a-780fbd07b2f6-תמונה.png
    שימו לב כי בתצוגה זו מוצגת בכל עמוד קבלה אחת בלבד. כדי לעבור לעמוד הבא, נשתמש בסרגל הניווט למטה:
    d427ad31-ad50-457d-98d5-4c9caa1decb8-תמונה.png

    נשמור את הדוח בשם: rptReciept_Details.

    זהו לבינתיים, מקווה שנהנתם!

    בפרק הבא אי"ה נלמד על טפסים רציפים.

    אני משאיר כמה שיעורי בית, בעיקר בעיצוב (מהקל למאתגר):

    1. הסירו את המסגרות מסביב לתיבות הטקסט בדוח.
    2. הוסיפו בכותרת התחתונה של העמוד את הכיתוב: "הודפס על ידי מערכת לניהול תורמים גירסא 0.01"
    3. הוסיפו את שעת ההדפסה המדוייקת בכותרת העליונה.
    4. הצמידו את ראשי התיבות נ"י לשם התורם כך שיופיעו מיד לאחריו בצורה יפה בלי רווח גדול.
    5. הסירו את השעה מתאריך החשבונית ומתאריך התרומה.

    בהצלחה!


  • אקסס למתחילים: תגובות
    OdedDvirO OdedDvir

    @בערל אמר באקסס למתחילים: תגובות:

    למדת הוראה?

    עלית עלי... אני עוסק בהוראה כבר הרבה שנים.

    אני קורא כל מילה - ומבצע

    זה מאד חשוב לבצע בשטח, רק ככה לומדים באמת!


  • לימוד טכנאות מחשבים
    OdedDvirO OdedDvir

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


  • שדרוג מראה עורך ה-VBA לערכת נושא VS2019 Dark
    OdedDvirO OdedDvir

    שלום לכולם,
    כידוע, מיקרוסופט מזניחה כבר שנים את עורך ה-VBA ולא הכניסה בממשק שלו שום שדרוגים (אולי היא מצפה מאיתנו להזניח אותו גם?)
    למרות העובדה שגם היום ישנם הרבה שמשתמשים בו כדי להוסיף פונקציונאליות קוד ליישומי אופיס - העורך עדיין תקוע בעיצוב מלפני 10 שנים+! באפשרויות של הגדרות הצבעים ישנם רק 16 צבעים לבחירה, ואין אפשרות להוסיף צבעים אחרים (אוף!)

    ובתור אחד שעובד מאסיבית באקסס (רח"ל 🙂 ) הדבר מפריע לי מאד...
    מצאתי פרוייקט בגיטהב שמאפשר להפוך את המראה המזעזע של עורך ה-VBA באופיס למראה יותר מודרני, בדומה לערכת הנושא הכהה של VS, על ידי עריכת פלטת הצבעים המקורית שנמצאת בקובץ VBA7.1.DLL. אחרי ששיחקתי עם התוכנה קצת, יצרתי ערכת נושא שמתאימה ל-VS2019 פחות או יותר, להלן דוגמא:
    27d41800-8cd9-4f4f-b412-f9e94b18f0f4-תמונה.png

    וזה אכן שיפור גדול, אבל הלכתי עוד צעד קדימה והחלפתי את הפונט לפונט Consolas גודל 13 כמו ב-VS, אבל אז כל העברית הפכה לג'יבריש:
    6d6250cd-c6a0-4a70-9635-eb062b9c9592-תמונה.png

    לאחר התקנת הפונט הערוך ConsolasH.ttf שמכיר בעברית כשפה מקובלת - הגעתי אל המנוחה והנחלה:
    5a9ade5f-7763-48b8-84bd-43131cb578cb-תמונה.png

    למי שרוצה לנסות, מצ"ב קובץ ערכת נושא שיצרתי: VS2019 Dark.xml
    שימו לב שצריך גם לשנות קצת את הבחירות בעורך ה-VBE, מי שרוצה פתרון קל, מצ"ב קובץ Reg (על אחריותכם) שמעדכן את הבחירה של הצבעים וגם את הפונט: VBE 7.0 Color Settings.reg

    הייתי רוצה לסיים בסוף טוב, אבל...
    מסתבר שמדי פעם מיקרוסופט חושבים עלינו ושולחים עדכונים לאופיס, ועורך ה-VBE חוזר לסורו (בערך...) ונהיה אפילו יותר גרוע (אזהרה: לא מומלץ לחולי אפילפסיה)
    77675f88-518c-4599-a197-55f7f53b64ef-תמונה.png
    כמו שרואים, הפונט נשאר וגם הגדרות הצבעים, אבל פלטת הצבעים (שנמצאת ב-DLL כאמור לעיל) התאפסה ואני צריך לחזור על הגדרות הצבעים מחדש...
    עשיתי זאת כמה פעמים עד שנמאס לי, ומצאתי פתרון אחר: יש לי עותק של קובץ ה-DLL הערוך, וכשזה קורה אני פשוט משכתב את הקובץ הקיים עם הקובץ השמור, והעורך חוזר למצב הראוי. אבל זה גם לא מושלם, אולי מיקרוסופט יחליטו לעדכן את ה-DLL באופן משמעותי, ושכתוב שלו עם הקובץ הקודם יצור בעיות חדשות....


  • מעונין בקוד לאקסס שירענן נתונים כאילו סגר את האקסס ופתח **נפתר**
    OdedDvirO OdedDvir

    @אליהו-בן השאלה שלך סיקרנה אותי לחפור קצת בנידון.
    כנראה שהאובייקט של MSXML2.XMLHTTP מפעיל מנגנון מטמון של הבקשות והתגובות, מה שמסביר את התופעה לעיל בדיוק, כי כל מופע של אקסס משוייך לאותו סשן על ידי המערכת.

    יש כמה הצעות לפיתרון, מהקל לכבד:

    1. להוסיף את הכותרות הבאות לאובייקט כשאתה יוצר אותו, בתקווה שהשרת יכבד אותן:
        Set xhrRequest = CreateObject("MSXML2.XMLHTTP.6.0")
        xhrRequest.setRequestHeader "pragma", "no-cache"
        xhrRequest.setRequestHeader "Cache-Control", "no-cache, no-store"
       Do Until order.EOF
       ...
    
    1. להשתמש באובייקט החלופי WinHttp.WinHttpRequest.5.1, שלא משתמש במטמון. שמות המתודות הנדרשות בו זהים לשמות שבאובייקט MSXML2.XMLHTTP.6.0, דהיינו:
    Set httpRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
    
    Do Until order.EOF
    'Url = "XXXXXXXXX?
    httpRequest.Open "GET", url, False
    httpRequest.Send
    res = httpRequest.responseText
    
    1. "לעבוד" על המנגנון של המטמון, ולגרום לו לחשוב שבכל פעם מדובר בבקשה שונה לחלוטין, על ידי הוספה של פרמטר "בובה" (dummy) המכיל מספר אקראי, כך:
    ' תריץ את הפקודה הזו פעם אחת בתחילת ההפעלה של התוכנה שלך
    Randomize
    ...
    ' ואז בקוד של השליחה
    
        ' יצירת מספר מ-1 עד 100000
        Dim dummyNumber As Long
        dummyNumber = Int((99999) * Rnd) + 1
    
        ' הוספת הפרמטר לבקשה
        xhrRequest.Open "GET", url, False & "&dummy=" & dummyNumber
    
    1. אם כלו כל הקיצין: תוכל לנקות את המטמון לפני כל הפעלה (על ידי קריאה ל-API של Windows) וכך לכפות יצירת סשן חדש בכל פעם.
      תדביק את הקוד הבא במודול חדש:
    Public Declare PtrSafe Function InternetSetOptionStr Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, ByVal lOption As Long, ByVal sBuffer As String, ByVal lBufferLength As Long) As Integer
    
    Public Sub ClearInternetCache()
        InternetSetOptionStr 0, 42, 0, 0
    End Sub
    

    ובקוד של השליחה תקרא למתודה שיצרת לעיל, לפני השליחה:

        ClearInternetCache
        Set xhrRequest = CreateObject("MSXML2.XMLHTTP.6.0")
    ...
    

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


  • Vue Mastery פתח את כל הקורסים לצפיה בחינם עד מוצאי יום ראשון
    OdedDvirO OdedDvir

    ליתר דיוק עד 24 ביולי 11:59PM EST
    35 קורסים
    לכניסה: https://www.vuemastery.com/free-weekend


  • מחפש מידע על המבנה של קבצי mp3
    OdedDvirO OdedDvir

    @dovid אמר במחפש מידע על המבנה של קבצי mp3:

    אז בנוסף לכל אתה גם משופשף פוליטית...

    חס וחלילה, אני פשוט לא יודע איך להגיב בלי שזה ישמע משופשף פוליטית..


  • חברותא ללמוד תכנות
    OdedDvirO OdedDvir

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

    הערך של מדריך \ מורה טוב - הוא עצום, כי יש בו את הדבר הכי חשוב: ניסיון.

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

    יש מדריכים באינטרנט ברמה מצויינת, ובמחיר שווה לכל נפש (אני למדתי JS+Node.js + כל מיני middlewares בקורס שעלה בסה"כ 70 שקל)
    ושלא נדבר על החומר שהוא חינמי לגמרי.

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


  • חידה חביבה: להיכן נעלם הכסף?
    OdedDvirO OdedDvir

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

    שלושה חברים ישבו במסעדה. בסיום הסעודה הגיש להם המלצר חשבון על סך 300 שקלים.
    כל אחד מהחברים הוציא שטר של 100 שקלים ושילם למלצר.
    לאחר שתי דקות חזר המלצר והתנצל:
    "אבקש את סליחתכם, נפלה טעות בחשבון, ובאמת הסכום לתשלום הוא רק 250 שקלים", והגיש להם את העודף: 50 שקלים.
    כל אחד מהחברים לקח מטבע של 10 שקלים, ואת העשרים הנותרים מסרו למלצר בתור טיפ.

    כמה דקות לאחר שיצאו החברים מהמסעדה, פתח אחד מהם ואמר:
    "אני לא מבין, לכולנו יחד היה סכום של 300 ש"ח. כל אחד מאיתנו שילם 100 שקלים וקיבל בחזרה 10 שקלים, כלומר כל אחד שילם 90 שקלים. עוד 20 ש"ח שילמנו טיפ למלצר. סה"כ שילמנו כולנו 90X3+20=290 ש"ח. אם כן, להיכן נעלמו עוד 10 שקלים ???".

    היכן הטעות בחישוב ולאן נעלם הכסף?


  • "חידה מתמטית פשוטה" או "למה אין לי אינטואיציה מתמטית בריאה?"
    OdedDvirO OdedDvir

    @yossiz אמר:

    האם זה התאים לאינטואיציה שלך?

    לא.

    אם לא, האם תוכל להסביר למה לא?

    בדבר המורכב משני חומרים בלבד, כשמשתנה התמהיל ואחוז החומר הראשון (המים) קטן, ברור כי אחוז החומר השני גדל כדי משלים את האחוז ל-100. לכן אם אחוז המים השתנה ב-1 ל-98%, וכן גם אחוז התפו"א גדל ב-1 ל-2%.
    עד כאן הכל טוב ויפה. אבל כמו שכתבת בדיוק: האינטואיציה אומרת ששינוי מספרי קטן גורר שינוי קטן בעקבותיו בלי לקחת בחשבון שכמות החומר הכוללת - דהיינו ה-100% - השתנתה דרמטית.

    האם תדע לטפל באינטואיציה שלך כך שבפעם הבא יהיה לך אינטואיציה נכונה?

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


  • שליחת בקשת POST UploadTextFile ל-API של ימות המשיח
    OdedDvirO OdedDvir

    @פשוט-אבל-תותח אתה צריך לבנות את הבקשה קצת אחרת, ולהפריד את העניינים.
    אני לא מנוסה בתחום, אבל הקוד הבא עשוי לעבוד:

    function uploadTextFileToYemot(){
    
    var data = {
      'token': '0733000000:1234',
      'what': 'ivr2:/1/IdListMessage.ini',
      'contents': SpreadsheetApp.getActiveSheet().getRange('L1').getValue()
    };
    
    var options = {
      'method' : 'post',
      'payload' : data
    };
    
      var response = UrlFetchApp.fetch('https://private.call2all.co.il/ym/api/UploadTextFile', options);
      //תוכל גם להציג את התגובה אם תרצה, על ידי השורה הבאה, או לנתח אותה כרצונך
      Logger.log(response.getContentText());
    }
    

    הערות:

    • שים לב ששלפתי את הנתונים ב-content ישירות מהתא L1.
    • התא K4 מיותר כעת.
    • אולי בהמשך הייתי מציע לאסוף את כל הנתונים מן הגיליון ישירות בקוד ולא על ידי נוסחאות מסובכות בגיליון.

  • התקנת תאורה בתקרת גבס
    OdedDvirO OdedDvir

    כל התשובות נכונות

    1. יש גופי תאורה ששקועים בגבס - אלו דורשים חיתוך של הגבס בצורה שתתאים לגוף התאורה, לדוגמא, ספוטים דורשים חיתוך בצורת עיגול. בדר"כ ההצמדה היא על ידי קפיצים בצדדים, מכווצים אותם ומכניסים לחור, והם משתחררים בתוך החלל של הגבס, ונצמדים ללוח הגבס מצידו השני.
    2. יש גוף תאורה חיצוני - אותו תולים על הגבס מבחוץ, בדומה לקיר רגיל, בתנאי שהוא לא כבד במיוחד. בסוג הזה יש אפשרות תיאורטית לכוון מראש את מיקום הניצב במקום שבו רוצים להתקין את הגוף, ולהשתמש בברגים רגילים, אבל זה לא נוח ולא קל לכוון את הניצבים כך שיעמדו במקום המתאים. השיטה הרווחת היא להשתמש בבורג גבס מיוחד. יש הרבה סוגים, אבל הרעיון של כולם דומה, שבמהלך ההברגה החלק הפנימי של הבורג מתרחב ו\או נצמד ללוח הגבס מצידו השני.
    3. פס לד - עקרונית לא מצריך שום הכנה, הדבק שבצידו השני מספיק ברוב המקרים. גם פה יש הרבה אפשרויות, כי לרוב לא רוצים שהפס יהיה גלוי, אז או שמסתירים אותו על ידי זוית, או שמשתמשים במסילת אלומיניום \ פלסטיק לתאורה, כעין מסילות הפלסטיק שמשמשות להעברת כבלים על הקיר, אלא שלאלו יש מכסה חצי שקוף שמאפשר לאור לעבור, ומשקעים אותם בקיר.

  • גלגל נדיר לדלת הזזה
    OdedDvirO OdedDvir

    @one1010 הבעיה במוצר הסיני היא שהאיכות שלהם גרועה והם נשחקים מהר.

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

    @חשמל אם אתה לא רוצה לקנות סיני זול ולהחליף אותו כל שנתיים, כנראה תצטרך לקנות את הסוג היקר תוצרת איטליה. בזמנו ביררתי וזוג עלה 180 ש"ח. כעת מצאתי ב-140 ש"ח לזוג כאן.


  • חיפוש תוכנה: המרת קובץ אקסל (xlsx) לcsv
    OdedDvirO OdedDvir

    @shraga כתב בחיפוש תוכנה: המרת קובץ אקסל (xlsx) לcsv:

    אולי מישהו יתנדב לסדר לך משהו מושלם.

    @dovid כתב בחיפוש תוכנה: המרת קובץ אקסל (xlsx) לcsv:

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

    @Whenever כתב בחיפוש תוכנה: המרת קובץ אקסל (xlsx) לcsv:

    אני חושב להפוך את סקריפט שימיר CSV לאקסל. זה יהיה לי שימושי.

    אחרי ש @mekev עשה עבודה יפה, אני מתנדב בשמחה להוסיף את השיפורים שלי:

    סקריפט batch משופר להמרה דו כיוונית (Excel<->Csv):

    @echo off
    if /i [%2]==[csv] goto TryConvert
    if /i [%2]==[xlsx] goto TryConvert
    
    echo Unsupported output format specified: %2
    exit /b
    
    :TryConvert
    echo Converting file %1 to %2 format, please wait...
    cscript /nologo "%~dp0ExcelCsvConvertorScript.vbs" "%~dpnx1" "%~dpn1.%2" %2
    echo Done!
    

    סקריפט VB משופר להמרה דו כיוונית:

    if WScript.Arguments.Count <> 3 Then
        Wscript.Echo "Error: invalid number of arguments specified." & vbNewline
        WScript.Echo "Usage: ExcelCsvConvertor <InputFileName> <OutputFileName> <OutputFormat>" & vbNewline
        WScript.Echo "Example: ExcelCsvConvertor input.xlsx output.csv csv"
        Wscript.Quit
    End If
    
    InputFileName = Wscript.Arguments.Item(0)
    OutputFileName = WScript.Arguments.Item(1)
    OutputFormat = lcase(WScript.Arguments.Item(2))
     
    Select Case OutputFormat
    Case "csv"
        XlFileFormatValue = 62
    Case "xlsx"
        XlFileFormatValue = 51
    Case Else
        Wscript.Echo "Unsupported output format specified: " & OutputFormat
        Wscript.Quit
    End select
    
    
    With CreateObject("Excel.Application")
        With .Workbooks.Open(InputFileName)
            .SaveAs OutputFileName, XlFileFormatValue
            .Close False
        End With
        .Quit
    End With
    

    קובץ להתקנה והסרה קלה מתפריט ההקשר (לחצן ימני):

    @echo off
    
    set convertor_path=%~dp0ExcelCsvConvertor.cmd
    cls
    echo ==========================================================================
    echo ExcelCsvConvertor: Context menu setup
    echo ==========================================================================
    echo.
    echo [1] Install   : Adds "Convert to CSV/Excel" options to context menu
    echo [2] Uninstall : Removes "Convert to CSV/Excel" options from context menu
    echo [Q] Quit
    echo.
    choice /C 12Q /T 1000 /D Q /N /M "Please select an option: "
    
    IF [%errorlevel%]==[1] GOTO Install
    IF [%errorlevel%]==[2] GOTO Uninstall
    exit /b
    
    :Install
    echo Installing...
    REG ADD HKEY_CLASSES_ROOT\SystemFileAssociations\.xlsx\shell\ConvertToCSV /f /d "Convert to CSV..."
    REG ADD HKEY_CLASSES_ROOT\SystemFileAssociations\.xlsx\shell\ConvertToCSV\command /f /d "\"%convertor_path%\" \"%%1\" csv"
    REG ADD HKEY_CLASSES_ROOT\SystemFileAssociations\.csv\shell\ConvertToExcel /f /d "Convert to Excel..."
    REG ADD HKEY_CLASSES_ROOT\SystemFileAssociations\.csv\shell\ConvertToExcel\command /f /d "\"%convertor_path%\" \"%%1\" xlsx"
    goto Done
    
    :Uninstall
    echo Uninstalling...
    REG DELETE HKEY_CLASSES_ROOT\SystemFileAssociations\.xlsx\shell\ConvertToCSV /f
    REG DELETE HKEY_CLASSES_ROOT\SystemFileAssociations\.csv\shell\ConvertToExcel /f
    goto Done
    
    :Done
    echo Done!
    pause
    

    הערות:

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

    והנה כל החבילה להורדה: (הערה: עיין בהמשך האשכול לגרסה משופרת 0.2)
    ExcelCsvConvertor.cmd
    ExcelCsvConvertorScript.vbs
    Setup (run as Administrator).cmd


  • באקסס- פיתרון ליצירת טופס עם כניסה למנהלים בלבד-ללא שום קודים!!!
    OdedDvirO OdedDvir

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

  • 1 / 1
  • התחברות

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

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