ברוך הבא לעולם האמיתי
השאלה היא לאו דווקא באקסס או ב-SQL, בכל בסיס נתונים היא מאתגרת
אבל בפירוש זה אפשרי, כתבתי פעם תוכנה באקסס לניהול גמח הלוואות, וטיפלתי גם במקרים כאלו
תמצית הבעיה היא שמלבד הלוואה ופרעון בפועל, יש עוד כמה סוגי תנועות פרעון צפוי, פרעון של ערב וכו' כמו שכתבת לעיל
יש כמה דרכים לתקוף את הבעיה
פתרון די פשוט הוא לחשוב על כל תנועות הכספים כטבלה אחת
יש עמודות שמשותפות לכל סוגי התנועות, כמו תאריך, וסכום, ומזהה מבצע התנועה
לכל תנועה תהיה עמודה נוספת שמייצגת את סוג התנועה
את המאזן של כל הלוואה מחשבים על ידי שאילתא
OdedDvir
-
החיים הם לא טבלה באקסס -
אקסס: הכנסת הרבה שורות בטופס אחד עם פרמטרים מטופס אחר@לעזור-לכולם כתב באקסס: הכנסת הרבה שורות בטופס אחד עם פרמטרים מטופס אחר:
(נ.ב. לכל המעירים למיניהם, לא כולם התברכו בכישרון הכתיבה, כמעט לכל השאלות ששאלתי, קיבלתי הערות על סגנון הכתיבה, אם הפורום נועד רק לבעלי עט מושחזת, כדאי לציין זאת, איתכם הסליחה)
ההערה שלי לא הייתה ח"ו על הנוסח וסגנון הכתיבה, כאן ב"ה זה לא פורום כתיבה אומנותית, אין חובה להשתמש בלשון צחה ובסגנון רהוט, בביטויים ספרותיים או בשיבוצים מקראיים.
ההערה שלי הייתה ניסיון לעורר אותך לעזור לי לעזור לך. פשוט בהיתי בשאלה שלך וניסיתי באמת להבין מה אתה מבקש, וזה העלה אצלי כ"כ הרבה שאלות שגרמו לי להתעצל מלהתחיל חקירה נגדית כדי לבסוף להשיב לך. במקרים כאלו אני לרוב פשוט מתעלם מהשאלה, לא תמיד בלב שלם, כי באמת יש לי הרבה חשק לעזור, אבל הרבה פחות סבלנות וזמן.
לא בדקתי את כל הפורום, אבל אני משער שסטטיסטית יש לך הרבה יותר סיכוי לקבל משוב מועיל על שאלה מושקעת ומפורטת, או קצרה ומדוייקת.
זכור שיש כאן שני צדדים, אתה הוא זה שמבקש עזרה, בוא נסכים שחלקך במאמץ המשותף לא יהיה פחות מחלק הצד המסייע? -
תבנית אקסס מוכנה - חדר מיוןלגבי ניהול מטופלים, אני לא מכיר תבנית מוכנה
יש את התבנית Access Patient Visit Hospital Medical Doctor Database Templates [Access-Templates.Com].accdb מהאתר access-templates, אבל אין בה יותר מדי, רק 3 טפסים ושאילתא.
פעם הבאתי כאן את כל התבניות שמצאתי בעברית מהגרסאות השונות של אקסס.
למעשה אתה יכול לקחת פחות או יותר כל אחת מהן לצורך למידה, ולהבין איך ליישם באופן שיתאים למקרה שלך
עצתי היא שתתחיל רק בחלק של פרטי הגעת המטופל שכתבת:איך הוא הגיע? (אמבולנס, עצמאי, מד"א)
האם הוא קיבל טיפול ראשוני (כן, לא.)
ממי הוא קיבל טיפול ראשוני (שם, טלפון, הכשרה,)מדובר כאן כבר על מספר טבלאות, ונדרשת מחשבה איך נכון לייצג את המידע בבסיס הנתונים
-
אקסס: הכנסת הרבה שורות בטופס אחד עם פרמטרים מטופס אחר@לעזור-לכולם כתב באקסס: הכנסת הרבה שורות בטופס אחד עם פרמטרים מטופס אחר:
האם יש אפשרות לקחת פרמטרים מטופס אחת למשנהו?
האם יש אפשרות לפתוח טופס לעדכון עם שורות מרובות(שמות כל הכיתה)?התשובה היא כן, אלו מעשים שבכל יום
אני אולי טועה במשהו?
לענ"ד בצורת השאלה שלך
האם אתה סתם מתעניין האם הדבר אפשרי או שאתה מחפש מישהו שיבנה לך תוכנה?
האם יש לך ידע באקסס? אם כן, האם פיתחת משהו ונתקעת בצורך הזה?
נסה להציג את השאלה שלך כך שהיא תעורר יותר תשובות ופחות שאלות -
mssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות@mekev כתב בmssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות:
(דוגמא אמיתית: לא נשמר היסטוריית מחיר עלות
והדוחות בתוכנה מבוססים על ההפרש בין המחיר במסמך המכירה למחיר עלות מכרטיס המוצרבוא נפריד בין הצורך לשימור מידע היסטורי, לבין הצורך בתיעוד פעולות (Audit).
במקרה זה זו לא בעיה של חוסר תיעוד, זהו תכנון לקוי של המערכת. לרוב עדיף לבצע מחיקה לוגית של נתון (סימון הרשומה כארכיון) ולא מחיקה פיזית של הרשומה.לגבי הצורך בתיעוד פעולות, הרישום ב-DB מספק פיתרון חלקי, כי הוא לא כולל פעולות שלא נוגעות בדאטא וכנ"ל.
איך תתעד בצורה הזו את כתובת ה-IP של מי שניגש למערכת? גם אם העברת את הנתון מהקליינט אל ה-db, איך תשלוף את זה ותצליב עם פעולה מסויימת בטבלה?@mekev כתב בmssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות:
מכאן מגיע הפרנויה שלי במערכות שאני כותב (מידע עסקי)
לשמור ולתעד את כל הרשומות ששונו, למה? כי יבוא יום שיהיה לזה משמעותתהיה לזה משמעות, ובוודאי עדיפות על לא כלום, אבל יהיה לך קושי גדול בהפקת תועלת בצורה כזו, לעומת תיעוד בלוג מובנה.
אני חוזר שוב: ללוגים אין שום ערך אם אי אפשר לתשאל אותם. -
mssql - התייעצות כיצד לשמור שינויי עריכה בטבלאות@mekev משום מה הגיוני לי יותר (לתפוס מנהג השוטים ו)לענות לך על אחרון ראשון:
1. כמה ואיזה מידע לשמור?
התשובה הלא ממש מפתיעה היא שזה תלוי: באופי הנתונים, בתדירות שבהם הם משתנים, בנפח המידע ובתפוקה (עיבוד ביחס לזמן), ובמשאבים שעומדים לרשותך. תשמור את המקסימום מחלק המידע שאתה חייב לשמור, ואת המינימום מהחלק שאתה לא.2. ספרייה מומלצת?
אני לא עובד עם node.js אבל נראה ש Pino ו-Winston ספריות פופולאריות מאוד. שתיהן תומכות בלוגים מובניים, אבל Pino דורשת פחות קונפיגורציה.3. מישהו יודע האם (תיעוד ב-SQL) עובד טוב ויעיל או שזה תוקע / גורם מורכבות בטרנזקציות וכו'?
הייתי נוטה להתרחק מהכיוון של תיעוד ברמת ה-SQL, אא"כ מדובר במערכת קטנה מאוד עם מעט מאוד רעש, או לחילופין במערכת קריטית שיש בה צורך לתעד כל פיפס בזמן אמת. במקרה האחרון מסתמא הייתי רושם את התיעוד ל-db אחר.
אני לא מספיק מומחה לדחות בידיים את הרעיון, אבל על פניו 3 טריגרים על כל טבלה נשמע לי מאוד מרתיע.
הסיבה היא שלרוב צד ה-db הוא צוואר הבקבוק במערכת, ולתיעוד ב-SQL יש מחיר גבוה.
הגע עצמך, אם כל שינוי של שדה בטבלה משכפל את הרשומה לטבלה אחרת, זה אומר שנפח הנתונים שלך עשוי לגדול בצורה מעריכית, לדוגמא, אם ביצעת 2 פעמים (בטרנזקציות נפרדות) עריכה של שדה מספר הטלפון של משתמש - שיכפלת את כל הרשומה שלו 3 פעמים. אם ערכת את השם שלו - שיכפלת פעם נוספת. אפילו אם הקלדת את הרשומה שלו בצורה חלקית, כי לא היה לך בהתחלה את הכתובת שלו, כשתערוך את השדה של הכתובת - תשכפל שוב את כל הרשומה. מחקת ערך בשדה בודד - שכפלת שוב. אני חושב שאתה קולט את התבנית.לוגים שמשכפלים רשומות שלמות בטבלה אכן לא משמיטים שום שינוי שבוצע במידע, אבל אני רוצה לומר לך את התפיסה שלי על לוגים: אין להם שום ערך אם אי אפשר לתשאל אותם. אני לא רוצה לדמיין את עצמי ולא אף יהודי טוב סורק טבלאות של מליון רשומות או כותב סלקטים מתוחכמים רק כדי לדעת מתי שינו את מספר הטלפון של פלוני, או מי מחק את הדוח לפני חודש.
לוגים מבניים בשכבת ה-DAL הם לדעתי הפתרון הטוב ביותר. אתה תרוויח גם יכולת לתעד חריגות ושאר אירועים שמתרחשים מחוץ לשכבת ה-DB או שאינם נוגעים בעדכון נתונים, כמו מה הדף הכי נצפה, התנהגות המשתמש עם האפליקציה, הזמן שלקח לבצע חישוב מסויים, וכו'.
-
mssql - התייעצות כיצד לשמור שינויי עריכה בטבלאותבאופן עקרוני, תיעוד אמור להיות מבוצע על ידי כלי, אתה לא אמור להמציא את הגלגל מחדש (ראה לקמן)
תיעוד בשכבת ה-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) -
שרת לאקסס@בעל-כישרון כתב בשרת לאקסס:
הנתונים דווקא בנויים בצורה טובה, אבל מה זה "להעביר ל sql server", זה פעולה פשוטה של להעביר, או שזה מצריך לבנות בסיס מהתחלה?
אפשר לייבא את הנתונים מאקסס ל-db של SQLServer, אבל זה דורש פיקוח שלך על כל שדה ושדה, לראות שההמרה מתבצעת נכון, דהיינו שטיפוס הנתונים בשדה תקין, ששדות המפתח תקינים, ואולי תצטרך ליצור את האינדקסים מחדש.
תוכל להשתמש באשף שמגיע עם SSMS, או לייצא את הטבלאות ל-CSV ולייבא אותן ל-SQLServer (לפעמים זה יותר קל)מה אתה מתכוין, דוקא נראה שמיקרוסופט מאוד ממליצים על זה, מה באמת החסרונות בזה?
השילוב של SharePoint ואקסס נזנח למיטב ידיעתי. עיין כאן וכאן
איפה ראית שממליצים על זה?
-
שרת לאקסס@בעל-כישרון כתב בשרת לאקסס:
שמעתי על שרפויינט של מיקרוסופט, האם יש מישהו שיודע להמליץ, אם זה תואם למטרה הזו?
SharePoint עבור אקסס נזנח מזמן
לענ"ד השדרוג המומלץ הוא להעביר את ה-backend ל-SQLServer ולקשר את הטבלאות באקסס לשם.
כמובן שזה אפשרי רק אם בנית את האפליקציה שלך בצורה טובה, כלומר הפרדת בין הממשק והנתונים, ולא השתמשת בסוגי נתונים סטנדרטיים בטבלאות (למשל, שדה מרובה ערכים)
הרווח בסופו של יום הוא עצום, כי זה מאפשר אחר כך שדרוג של הממשק לטכנולוגיה אחרת, מבלי לפגוע ברצף העבודה בממשק האקססי.אם האמור לעיל לא רלוונטי, אז בעדיפות שניה כדאי להשתמש ב-TSPlus, אבל זה יקר ודורש קונפיגורציה ותחזוקה יותר מורכבת, ותצטרך לעשות כמה קנעטשים באקסס כדי שזה יעבוד טוב. עבדתי כך כמה שנים בעומס של כ-20 משתמשים.
לצערי אני לא מכיר את AppSheet כדי לחוות עליו דעה.
-
תקלה בהרשאות במחשב "ספירת אובייקטים בגורם המכיל נכשלה. הגישה נדחתה"נסה להשתמש בכלי הזה כדי לאפס את הרשאות ה-NTFS בתיקיות הנ"ל:
https://www.majorgeeks.com/files/details/ntfs_permissions_tools.html -
דפי צביעה לילדים "צדיק נסתר" -
מהי מערכת הפעלה לינוקס קלה ביותראם אתה רוצה GUI יש את PuppyLinux (~600M) או antiX (~1GB)
-
עזרה בפתרון בעיות עכבר במחשב ניידבד"כ יש צירוף מקשים שנועל את משטח המגע. נסה ללחוץ על F6 או fn+F6.
יתכן ואצלך זה מקש שונה מ-F6, חפש את הסמל הזה:

אם זה לא עוזר, צריך לבדוק בהגדרות של 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
-
עזרה בפתרון בעיות עכבר במחשב ניידברוך הבא לפורום.
השאלה שלך מאוד כללית. אם תשקיע בשאלה מפורטת, יש סיכוי יותר טוב שמישהו ישקיע מזמנו כדי לעזור לך.
ציין את מודל המחשב המדוייק, האם המשטח עבד בעבר, אם כן מתי הפסיק לעבוד, ומה ניסית לעשות. -
אקסס | ניהול והחלפת טבלאות מקושרות - האם הקוד מ AI תקין?@חייםיודלביץ כתב באקסס | ניהול והחלפת טבלאות מקושרות - האם הקוד מ AI תקין?:
אז זה קוד תקין ורצוי?
קוד שהוא בגדר קופסה שחורה שעושה הוקוס-פוקוס ועובד - הוא קוד שאין לך אפשרות לתחזק ביום שהוא יחליט פתאום להפסיק לעבוד.
אני לא אומר לא להשתמש בקוד כזה, רק לקחת את זה בחשבון.קוד תקין ורצוי הוא בעיני קוד שאתה מבין בדיוק מה קורה בו.
אם זה נכון לגבי הקוד הזה, אז התשובה היא כן. בניכוי השורות המיותרות הנ"ל. אגב, גם שורה 11 מיותרת.למה הרבה קודים ברשת משתמשים בכל מיני משתנים שדורשים הפניות ואז זה נורא מסתבך עם גרסאות האקסס, יש לזה מעלה על הקוד הפשוט הנ"ל?
אני לא מבין את השאלה, תוכל לתת דוגמא לקוד אחר שעושה את הפעולה הנ"ל?
אם השאלה שלך היא כללית - אנא פתח נושא חדש ותן דוגמא. -
אקסס | ניהול והחלפת טבלאות מקושרות - האם הקוד מ AI תקין?- שורות 6,14,15 מיותרות
- הקישור למסד נתונים חיצוני כלשהו (אקסס, SQL, Excel וכו') נעשה על ידי מחרוזת חיבור
ConnectionString. מחרוזת זו מכילה גם את הכתובת של המסד החיצוני, וגם את הסיסמה אליו, אם יש כזו. - בגדול, אקסס מנהלת את כל הטבלאות על ידי טבלאות מערכת מוסתרות. ניתן להציג אותן על ידי קליק ימני על סרגל הניווט > אפשרויות ניווט > ולסמן V בתיבה הצג אובייקטים מוסתרים ו- הצג אובייקטי מערכת
- הטבלה MSysObjects אחראית על האובייקטים שנמצאים בסרגל הניווט. גם מחרוזות החיבור לטבלאות המקושרות נשמרות שם.
נסה להריץ את השאילתא הבאה:
SELECT * FROM MSysObjectsבעמודה Connect תופיע מחרוזת החיבור.
הקוד שהבאת בסה"כ עובר על הרשומות בטבלה הזו, ובודק איזה מהם הוא טבלה (בשורה 10) אם כן, הוא מעדכן את מחרוזת החיבור. -
המלצה לקורס@ארי
א. אני מזדהה עם דרך הלימוד שלך.
ב. יש לי דעה שונה מ @pcinfogmach:
זה שגוי בעיני להתקבע על שפה מסויימת מראש. אני מייעץ לך לא לחשוב יותר מדי בשלב הזה. אם אתה מרגיש שאתה רוצה להתקדם, זה סימן שאתה מוכן. (אגב, יש שאלות ש @pcinfogmach העלה שאני עדיין לא יודע להשיב עליהן
) פשוט תקפוץ למים ותתחיל עם משהו, נסה אותו למשך שבועיים שלושה, ותראה אם אתה מתחבר לסגנון. אני לקחתי קורס שלם על nodeJs ב-udemy, ובסוף החלטתי בכלל על דוטנט. ועדיין אני מנסה פה ושם דברים אחרים.
ג. מסכים שיש הבדל בין אקסס ו-VBA לשפות אחרות, אבל זה נכון גם על כל פלטפורמה אחרת. אין באמת הבדל גדול בעקרונות התכנות בין שפה לשפה. לפי הפעילות שלך בפורום, אני מבין שיש לך הבנה טובה ב-VBA ואקסס. חשוב לי להדגיש שכל נסיון שצברת בתכנות, בכל שפה, מוסיף לניסיון הכללי שלך כמתכנת. -
אקסל | דרושה נוסחה לבדיקת תקינות מס חשבון בנקדי מהר מצאתי את הפרוייקט הזה בגיטהב, מלפני שנתיים, נראה לגיטימי: 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 -
אקסל | דרושה נוסחה לבדיקת תקינות מס חשבון בנקהיינו הך
זה כתוב ב-VBA, אז פשוט תעתיק את המודול מקובץ האקסס לתוך האקסל
ואז הפונקציות יהיו זמינות לך שם -
שימוש עם VScode בSSH בשרת זוללת משאבים??שימוש עם VScode בכל מחשב שהוא - זולל משאבים. נקודה.
פתיחה של קובץ batch בגודל 116 בתים בלבד - נוגסת בכ-100MB של RAM.
