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

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

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

OdedDvir

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

פוסטים

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

  • החיים הם לא טבלה באקסס
    OdedDvirO OdedDvir

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

    תוכנה

  • אקסס: הכנסת הרבה שורות בטופס אחד עם פרמטרים מטופס אחר
    OdedDvirO OdedDvir

    @לעזור-לכולם כתב באקסס: הכנסת הרבה שורות בטופס אחד עם פרמטרים מטופס אחר:

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

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

    תוכנה

  • תבנית אקסס מוכנה - חדר מיון
    OdedDvirO OdedDvir

    לגבי ניהול מטופלים, אני לא מכיר תבנית מוכנה

    יש את התבנית Access Patient Visit Hospital Medical Doctor Database Templates [Access-Templates.Com].accdb מהאתר access-templates, אבל אין בה יותר מדי, רק 3 טפסים ושאילתא.

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

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

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

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

    תכנות

  • אקסס: הכנסת הרבה שורות בטופס אחד עם פרמטרים מטופס אחר
    OdedDvirO OdedDvir

    @לעזור-לכולם כתב באקסס: הכנסת הרבה שורות בטופס אחד עם פרמטרים מטופס אחר:

    האם יש אפשרות לקחת פרמטרים מטופס אחת למשנהו?
    האם יש אפשרות לפתוח טופס לעדכון עם שורות מרובות(שמות כל הכיתה)?

    התשובה היא כן, אלו מעשים שבכל יום

    אני אולי טועה במשהו?

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

    תוכנה

  • mssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות
    OdedDvirO OdedDvir

    @mekev כתב בmssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות:

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

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

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

    @mekev כתב בmssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות:

    מכאן מגיע הפרנויה שלי במערכות שאני כותב (מידע עסקי)
    לשמור ולתעד את כל הרשומות ששונו, למה? כי יבוא יום שיהיה לזה משמעות

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

    תכנות

  • mssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות
    OdedDvirO OdedDvir

    @mekev משום מה הגיוני לי יותר (לתפוס מנהג השוטים ו)לענות לך על אחרון ראשון:

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

    2. ספרייה מומלצת?
    אני לא עובד עם node.js אבל נראה ש Pino ו-Winston ספריות פופולאריות מאוד. שתיהן תומכות בלוגים מובניים, אבל Pino דורשת פחות קונפיגורציה.

    3. מישהו יודע האם (תיעוד ב-SQL) עובד טוב ויעיל או שזה תוקע / גורם מורכבות בטרנזקציות וכו'?
    הייתי נוטה להתרחק מהכיוון של תיעוד ברמת ה-SQL, אא"כ מדובר במערכת קטנה מאוד עם מעט מאוד רעש, או לחילופין במערכת קריטית שיש בה צורך לתעד כל פיפס בזמן אמת. במקרה האחרון מסתמא הייתי רושם את התיעוד ל-db אחר.
    אני לא מספיק מומחה לדחות בידיים את הרעיון, אבל על פניו 3 טריגרים על כל טבלה נשמע לי מאוד מרתיע.
    הסיבה היא שלרוב צד ה-db הוא צוואר הבקבוק במערכת, ולתיעוד ב-SQL יש מחיר גבוה.
    הגע עצמך, אם כל שינוי של שדה בטבלה משכפל את הרשומה לטבלה אחרת, זה אומר שנפח הנתונים שלך עשוי לגדול בצורה מעריכית, לדוגמא, אם ביצעת 2 פעמים (בטרנזקציות נפרדות) עריכה של שדה מספר הטלפון של משתמש - שיכפלת את כל הרשומה שלו 3 פעמים. אם ערכת את השם שלו - שיכפלת פעם נוספת. אפילו אם הקלדת את הרשומה שלו בצורה חלקית, כי לא היה לך בהתחלה את הכתובת שלו, כשתערוך את השדה של הכתובת - תשכפל שוב את כל הרשומה. מחקת ערך בשדה בודד - שכפלת שוב. אני חושב שאתה קולט את התבנית.

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

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

    תכנות

  • mssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות
    OdedDvirO OdedDvir

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

    תיעוד בשכבת ה-SQL
    יש ל-SQLServer יש אפשרות מובנית לתיעוד על ידי שימוש במעקב שינויים
    ראה כאן מדריך בנושא: https://www.sqlshack.com/creating-a-sql-server-audit-using-sql-server-change-tracking/
    היתרון באפשרות הזו הוא: שהכל מתחיל ונגמר ב-SQL, ללא צורך בכלים נוספים
    החיסרון בגישה הזו הוא: שהכל מתחיל ונגמר ב-SQL... קשה מאוד לתשאל את הנתונים במקרה שרוצים לחקור אירוע, התיעוד מבוצע לתוך הDB, ולא לתוך קבצי טקסט חיצוניים, ושיטה זו עלולה בקלות להוסיף המון רעשי רקע לפעילות השוטפת של ה-DB

    תיעוד בשכבת DAL
    אם יש לך שכבת DataAccess, למשל API שמבצע את השליפה של הנתונים.
    בדוטנט מומלץ להשתמש בכלי תיעוד כגון Serilog
    שיטה זו היא העדיפה ביותר: אפשר לבנות לוגים מבניים Structured logs שניתנים לתחקור בקלות על ידי כלי אנליטיקה של לוגים, כמו SEQ
    אפשר לתעד לקבצי json יומיים, לשלוט על כמות המידע שנצבר ולהגדיר מתי למחוק לוגים ישנים, ל-Serilog יש אפשרות לנקז את הלוגים שלו לכמה אפיקים במקביל. למשל: תוכל לשלוח בו זמנית את הלוגים שלך לקבצים בדיסק, לקונסול, וגם לשרת לוגים כמו SEQ או QRadar שנותנים לך המון אפשרויות להצגה נוחה של הפעילות, ניתוח ושאילתות פילוח (מי המשתמשים שנכנסו הכי הרבה בחודש האחרון, מה הזמן הממוצע שמשתמש מחובר למערכת וכו')
    החיסרון? לא תמיד יש שכבת DAL מסודרת. אבל אם זה המקרה, אז יש כאן בעיה הרבה יותר גדולה מבעיית חוסר התיעוד.

    להמציא את הגלגל
    זה בפירוש לא מומלץ לכל מקרה, ואני בספק אם יש לזה מקום מעשי בכלל, אבל במקרה הנדיר שכן, אתה יכול לבנות כלי מהיר ומלוכלך לתיעוד ב-SQL:
    SQL Server 2016 ומעלה:

    CREATE PROCEDURE [dbo].[fn_GetJsonData]
    -- =================================================
    -- Description:	Get JSON data from a table row
    -- =================================================
        @TableName NVARCHAR(max),
        @Id INT,
        @Columns NVARCHAR(max) = '*',
        @JsonData NVARCHAR(max) OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @Sql NVARCHAR(max) = 'SELECT @JsonData=(SELECT TOP 1 ' + @Columns + ' FROM ' + @TableName + ' WHERE Id=' + CAST(@Id AS VARCHAR) + ' FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER)'
    
        EXEC sp_executesql @Sql,
            N'@JsonData NVARCHAR(max) OUTPUT',
            @JsonData OUTPUT
    END
    GO
    

    טבלת תיעוד פשוטה:

    CREATE TABLE MySimpleAudit (
        Id INT identity(1, 1) PRIMARY KEY,
        TableName NVARCHAR(max),
        OriginalData NVARCHAR(max),
        NewData NVARCHAR(max),
        LogTimeStamp DATETIME2 DEFAULT getutcdate()
        )
    

    כדי לתעד, אתה צריך לקרוא לפרוצדורה הנ"ל לפני השינוי ואחריו, ולתעד את השינויים לטבלה:

    
    -- Init variables:
    DECLARE @OriginalData NVARCHAR(max), @NewData NVARCHAR(max);
    
    -- Get original data:
    EXEC [dbo].[fn_GetJsonData] @TableName = 'Payments',
        @Id = 1234,
        @Columns = 'Id,Amount',
        @JsonData = @OriginalData OUTPUT
    
    -- Do manipulations on the table:
    -- ...........
    ---
    
    -- Get Changes:
    
    EXEC [dbo].[fn_GetJsonData] @TableName = 'Payments',
        @Id = 1234,
        @Columns = 'Id,Amount',
        @JsonData = @NewData OUTPUT
    
    INSERT INTO [MySimpleAudit] (TableName, OriginalData, NewData)
    VALUES ('Payments', @OriginalData, @NewData)
    
    תכנות

  • שרת לאקסס
    OdedDvirO OdedDvir

    @בעל-כישרון כתב בשרת לאקסס:

    הנתונים דווקא בנויים בצורה טובה, אבל מה זה "להעביר ל sql server", זה פעולה פשוטה של להעביר, או שזה מצריך לבנות בסיס מהתחלה?

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

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

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

    איפה ראית שממליצים על זה?

    תכנות

  • שרת לאקסס
    OdedDvirO OdedDvir

    @בעל-כישרון כתב בשרת לאקסס:

    שמעתי על שרפויינט של מיקרוסופט, האם יש מישהו שיודע להמליץ, אם זה תואם למטרה הזו?

    SharePoint עבור אקסס נזנח מזמן

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

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

    לצערי אני לא מכיר את AppSheet כדי לחוות עליו דעה.

    תכנות

  • תקלה בהרשאות במחשב "ספירת אובייקטים בגורם המכיל נכשלה. הגישה נדחתה"
    OdedDvirO OdedDvir

    נסה להשתמש בכלי הזה כדי לאפס את הרשאות ה-NTFS בתיקיות הנ"ל:
    https://www.majorgeeks.com/files/details/ntfs_permissions_tools.html

    חומרה

  • דפי צביעה לילדים "צדיק נסתר"
    OdedDvirO OdedDvir

    @14789 כתב בדפי צביעה לילדים "צדיק נסתר":

    רק שאלה איך צובעים על זה?

    spiralbetty_1711108778883.png

    גומלין - כללי

  • מהי מערכת הפעלה לינוקס קלה ביותר
    OdedDvirO OdedDvir

    אם אתה רוצה GUI יש את PuppyLinux (~600M) או antiX (~1GB)

    תוכנה

  • עזרה בפתרון בעיות עכבר במחשב נייד
    OdedDvirO OdedDvir

    בד"כ יש צירוף מקשים שנועל את משטח המגע. נסה ללחוץ על F6 או fn+F6.
    יתכן ואצלך זה מקש שונה מ-F6, חפש את הסמל הזה:
    001_how-to-unlock-the-touchpad-on-a-lenovo-laptop-5209550-23fa004942724627aa42d999f1406f95-3ca5b91f795248e0b1b4b651db03574f.webp

    אם זה לא עוזר, צריך לבדוק בהגדרות של windows. תעקוב אחרי ההוראות כאן: https://pcsupport.lenovo.com/il/he/products/laptops-and-netbooks/flex-series/flex-5-1570/videos/vid100752-how-to-enable-and-disable-your-touchpad

    חומרה

  • עזרה בפתרון בעיות עכבר במחשב נייד
    OdedDvirO OdedDvir

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

    חומרה

  • אקסס | ניהול והחלפת טבלאות מקושרות - האם הקוד מ AI תקין?
    OdedDvirO OdedDvir

    @חייםיודלביץ כתב באקסס | ניהול והחלפת טבלאות מקושרות - האם הקוד מ AI תקין?:

    אז זה קוד תקין ורצוי?

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

    קוד תקין ורצוי הוא בעיני קוד שאתה מבין בדיוק מה קורה בו.
    אם זה נכון לגבי הקוד הזה, אז התשובה היא כן. בניכוי השורות המיותרות הנ"ל. אגב, גם שורה 11 מיותרת.

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

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

    תכנות

  • אקסס | ניהול והחלפת טבלאות מקושרות - האם הקוד מ AI תקין?
    OdedDvirO OdedDvir
    1. שורות 6,14,15 מיותרות
    2. הקישור למסד נתונים חיצוני כלשהו (אקסס, SQL, Excel וכו') נעשה על ידי מחרוזת חיבור ConnectionString. מחרוזת זו מכילה גם את הכתובת של המסד החיצוני, וגם את הסיסמה אליו, אם יש כזו.
    3. בגדול, אקסס מנהלת את כל הטבלאות על ידי טבלאות מערכת מוסתרות. ניתן להציג אותן על ידי קליק ימני על סרגל הניווט > אפשרויות ניווט > ולסמן V בתיבה הצג אובייקטים מוסתרים ו- הצג אובייקטי מערכת
    4. הטבלה MSysObjects אחראית על האובייקטים שנמצאים בסרגל הניווט. גם מחרוזות החיבור לטבלאות המקושרות נשמרות שם.
      נסה להריץ את השאילתא הבאה:
    SELECT * FROM MSysObjects
    

    בעמודה Connect תופיע מחרוזת החיבור.
    הקוד שהבאת בסה"כ עובר על הרשומות בטבלה הזו, ובודק איזה מהם הוא טבלה (בשורה 10) אם כן, הוא מעדכן את מחרוזת החיבור.

    תכנות

  • המלצה לקורס
    OdedDvirO OdedDvir

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

    תכנות

  • אקסל | דרושה נוסחה לבדיקת תקינות מס חשבון בנק
    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

    היינו הך
    זה כתוב ב-VBA, אז פשוט תעתיק את המודול מקובץ האקסס לתוך האקסל
    ואז הפונקציות יהיו זמינות לך שם

    תוכנה

  • שימוש עם VScode בSSH בשרת זוללת משאבים??
    OdedDvirO OdedDvir

    שימוש עם VScode בכל מחשב שהוא - זולל משאבים. נקודה.
    פתיחה של קובץ batch בגודל 116 בתים בלבד - נוגסת בכ-100MB של RAM.

    תכנות
  • 1
  • 2
  • 3
  • 4
  • 5
  • 119
  • 120
  • 3 / 120
  • התחברות

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

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