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

OdedDvir
-
אקסס למתחילים: תגובות -
עזרה | הזנת ערך הפרמטר באקססיש דרך ארוכה וקצרה ויש קצרה וארוכה:
הדרך הקצרה והארוכה
היא להכניס פונקציות שלך בתוך השאילתות ו...
א. להשתמש בשאילתת ביניים כמו ש @clickone ציין,
או
ב. להכפיל את החישוב גם עבור שדה זה (רח"ל)כמו ש @מלא ציין.
שתי הדרכים לא מומלצות, כמו שאסביר מיד.הדרך הארוכה והקצרה
ברגע שיש לי רעיון, הפיתוי הראשון שלי כמתכנת זה להתחיל מיד לכתוב קוד. אבל זה לא נכון.
הדרך הנכונה היא להשקיע זמן בתכנון נכון של מבנה הנתונים והשאילתות, בזרימה הרצויה של התוכנה, מה הקלט והפלט הרצוי וכו'. זה לוקח זמן, לפעמים מורט עצבים ומתסכל, אבל תמיד זה עדיף לעשות כן לפני שכתבתי שורת קוד אחת מאשר אחרי כן. עם הניסיון התהליך הזה נהיה יותר נעים וקצר.כללי אצבע:
- חישובים שאמורים להתבצע רק פעם אחת - לבצע רק פעם אחת ולשמור בטבלה.
- להמנע כמה שניתן מלהכניס פונקציות בשאילתות. בפרט פונקציות שמוגדרות על ידי המשתמש.
זה נכון הן מבחינת יעילות:
- שאילתות רצות הרבה יותר מהר מקוד VBA באקסס, כי כל קריאה לפונקציה דורשת משאבים מהמערכת.
- אתה לא צריך לחשב חישובים מיותרים פעמיים (או יותר) כדי שהשאילתא תואיל בטובה לקבל את הערך של הפונקציה.
- שים לב שאפילו בפונקציות טריוויאליות, כמו Nz() או IsNull() עדיף לרשום בSQL טהור ולא לבצע קריאה ל-VBA, תשווה למשל בין:
IsNull(SomeField) AS ValueIsEmpty
ל:
(SomeField Is Null) AS ValueIsEmpty
הראשונה קוראת לפונקצית VBA בשם IsNull() בעוד השניה משתמשת רק בSQL והיא הרבה יותר מהירה.
דוגמה שניה:
תשווה בין:Nz(Amount,0)
ל:
IIf(Amount Is Null, 0, Amount)
האופציה השנייה עדיפה בהרבה, כי היא משתמשת ב SQL טהור, ולכן
- אתה לא מבצע קריאה לפונקציה
- אתה שומר על טיפוס המשתנה בשדה (Data Type)
- הקריטריון (אם יש בשאילתה) מחושב נכון
- העמודה ממויינת נכון
(הערה: יש הבדל עצום בין IIF של SQL שהיא פונקציה יעילה, לבין IIF של VBA, שהוא פונקציה גרועה שמחשבת תמיד את שתי התוצאות האפשריות!)
והן מבחינת תחזוקה:
- לפעמים פונקציה כתובה לא נכון ומייצרת שגיאת ריצה שמוכפלת אלפי פעמים בשאילתא - תרחיש לא נעים בכלל הן לך כמפתח וכ"ש למשתמש.
- אם תרצה אי פעם לשדרג לבסיס נתונים אחר - הפונקציות לא יעבדו.
-
מיון באקסל לפי סדר מספרים@dovid אמר במיון באקסל לפי סדר מספרים:
צריך לחלק לשני עמודות ואז לעשות מיון של שתי רמות.
בדיוק! ברשות @dovid אני ארחיב:
כדי להפריד את הנתונים (אותיות לחוד ומספרים לחוד) צור שתי עמודות עזר:
בתא B2 כתוב:=LEFT(A2,2)
ובתא C2 כתוב:
=RIGHT(A2,LEN(A2)-2)
שכפל את הנוסחאות הנ"ל עד סוף הטבלה. אחר כך תבחר את הכל ותעשה מיון לפי 2 רמות כמו ש@dovid אמר. הנה צילום מסך:
והתוצאה:
-
בעיה בקוד vba להורדת קובץ משרת ftp@אוריי אתה צריך להוסיף הפנייה בעורך הVBA אל Microsoft Internet Transfer Control 6.0 (SP6). לשם כך אתה צריך את הקובץ MSINET.OCX. הוא לא קיים ב Windows 10. תנסה להשתמש בזה msinet.ocx או להוריד אחד מהאינטרנט.
אח"כ בעורך VBA תוסיף הפניה לקובץ:
Tools>Reference>Browse
בחלון שנפתח תסמן את הקובץ שהורדת (ייתכן וכדי לראותו תצטרך לשנות את סוג הקבצים המוצגים בחלון)בהצלחה!
תוספת:
שכחתי שלב חשוב והוא לרשום את הספריה בWindows.
עבור Windows גרסת 32 ביט יש להעתיק את הקובץ ל C:\Windows\System32 ולהריץ שורת פקודה כמנהל כך:regsvr32 C:\Windows\System32\MSINET.OCX
עבור גרסת 64 ביט צריך להעתיק ל C:\Windows\SysWOW64 ולהריץ שורת פקודה כמנהל כך:
regsvr32 C:\Windows\SysWOW64\MSINET.OCX
-
מחשב חזק לסביבת עבודה למתכנת@חוקר אמר במחשב חזק לסביבת עבודה למתכנת:
האם הדבר היחיד שיש לי לשדרג זה מעבד ל i9
האינטואיציה שלי אומרת לי שלא.
בתנאי החומרה שלך, לדעתי יש כאן הרבה מקום לשיפור על ידי תחזוקה נכונה של המחשב. שדרוג חומרה זה הצעד האחרון אחרי שכלו כל הקיצין. בפרט אם אם בהתקנה נקייה של Windows העיכוב הנ"ל נעלם.הנה כמה אפשרויות לשיפור:
- תבדוק את כל התוכנות שרצות בקביעות ברקע, והאם באמת יש לך צורך בהן תמיד, או שלפחות בזמן הפיתוח אפשר לוותר עליהן. שים לב שיש לך 32 תהליכים של גוגל כרום רצים במקביל.
- ניקוי הרג'יסטרי על ידי CCleaner.
- העברת קבצי הפיתוח לכונן SSD.
- מגיגול קצר ראיתי שהעיכוב בהשלמה אוטומטית של phpStorm הוא בעיה נפוצה. יש בתוצאות החיפוש גם כמה פתרונות, אבל לא בדקתי לעומק.
-
מדפסת מדפיסה כמה עמודים ומפסיקהנסה לאפס את הספולר של המדפסת.
כנס לשורת הפקודה עם הרשאות מנהל, ותקליד את הפקודות הבאות:net stop spooler DEL /F /S /Q %systemroot%\System32\spool\PRINTERS\* net start spooler
-
בקשת עזרה - הגדרות ראוטר 019 מחדש לאחר קפיצה בחשמל ואיפוס - נפתרהנציגים טענו שאין צורך בשם וסיסמה...
בס"ד בסופו של דבר מצאתי את הפיתרון בעצמי, אני אפרט את הדרך שמא יהיה למישהו תועלת מזה:- התחברתי עם כבל LAN, נכנסתי ל-gateway 192.168.1.1 עם שם משתמש: home וסיסמה: Home013 (כך רשום על המדבקה למטה)
- תחת תחזוקה maintance ביצעתי איפוס להגדרות יצרן:
- אחרי זה, באורח פלא החיבור חזר (דרך כבל LAN). אלא שה-wifi היה עם סיסמה דיפולטיבית, וכשניסיתי להיכנס שוב ל-gateway שם המשתמש והסיסמה בסעיף 1 לא עבדו... התקשרתי אל 019 והם אמרו שהסיסמה היא Home (בלי הספרות 013). נו נו.
- שיניתי את הגדרות ה-wifi כרצוני ונשמתי לרווחה.
-
בעיה בסינון מיילים בגימייל -
לינק להגדרות המייל@שואף תוכל לצרף את כתובת המייל של הנמען ישירות כפרמטר ב-URL:
https://mail.google.com/mail/u/someuser@gmail.com/#settings
-
שירות לקוחות ושדרוגים של מתכנת עצמאיאתה מדבר לגמרי לעניין. ניכר מדבריך שחשוב לך לרצות את הלקוחות, וזו מעלה שלך כנותן שירות.
מנסיון שלי, תכנון מוקדם פותר הרבה מן הבעיות שציינת.- הכנת מסמך אפיון מפורט של התוכנה ואישור של הלקוח.
- קביעת לוח זמנים ואבני דרך לביצוע וכן לתשלומים.
- חתימת חוזה מסודר עם ציון כל הנ"ל בחוזה.
- כדאי לציין שתתכן סטייה של 10% בזמני הביצוע.
כשהחוזה חתום, יד המשנה על התחתונה.
לגבי שינויים במהלך העבודה:
זה תלוי מאד האם התמחור נעשה על פי שעות עבודה או בקבלנות. אם התמחור לפי שעות זה מאפשר הרבה יותר גמישות מבחינת המתכנת, והוא הרבה פעמים מוכן להציע מעצמו שדרוגים ותוספות לתוכנה במהלך הדרך. אם התמחור סגור מראש הלקוח אמנם רגוע יותר, אך המתכנת פתוח פחות לשינויים וצריך להבהיר מראש כי שינויים משמעותיים יידרשו תוספת עלות או לא יתאפשרו לעתים.
אם הלקוח שואל מדוע העלות היא כך וכך, צריך לענות שזמן העבודה הנדרש הוא X שעות וזה המחיר שלי.
גם את האופציה לשדרוגים כדאי לתחום לפרק זמן מסויים. אני לא מסוגל להיות זמין בכל עת לבצע שינויים ותוספות, גם אם זה רווחי ללקוח.
עם האמור לעיל, כדאי להיות קשוב לצרכי הלקוח תוך כדי העבודה, חשוב שגם הוא ירגיש מרוצה ושקיבל תמורה הולמת לכספו.
חשוב מאד לתת מענה כלשהו ולשדר כי אתה קשוב (לא להתעלם מטלפונים או מיילים וכו'). אני משתדל לתת ללקוח הרגשה כזו, ולהיות אמיתי, אפשר לומר: זה באמת רעיון מצויין, אבל זה עלול לגרום כרגע לעיכובים בתכנית, אך אני עסוק כרגע בפרוייקטים נוספים, אולי ניתן יהיה לבצע בהמשך. -
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)
-
מעונין בקוד לאקסס שירענן נתונים כאילו סגר את האקסס ופתח **נפתר**@אליהו-בן אתה צריך לגרום ל-Recordset לשקף את השינויים בנתונים תיכף כשהם קורים. יש כמה דרכים לעשות את זה, וזה תלוי באופן שבו השינויים בנתונים מתבצעים (האם זה עריכה בטופס, שינוי ישיר בטבלה או על ידי קוד שרץ ברקע), וגם באופן שבו הקוד האמור לעיל מופעל (לחיצה על פקד בטופס, וכו'). תפרט בבקשה במה מדובר ואנסה לעזור לך.
כדי שלא אעביר את זמני בניחושי סרק במה בדיוק מדובר, כמו שעשו כולם כאן, אני ממתין לגילוי אליהו -
בנייה נכונה של API לעריכת ישות עם כמה ישויות קשורים@yossiz אני גם לא למדתי את הנושא באופן מסודר, ומסתפק אם יש לי מה להוסיף לך בנושא, אבל כיון שביקשת:
בקצרה, RESTful API הוא סגנון עיצוב של ה-API בצורה [השואפת ל]כך שבקשות ה-HTTP שנשלחות אל ה-API יבצעו פעולה בהתאמה לסוג המתודה של הבקשה (HttpMethod), למשל:
POST ליצירה
GET עבור קריאה
PUT עבור עדכון
DELETE עבור מחיקהוכן נקודות הקצה של ה-API יהיו במבנה מאורגן, בד"כ היררכי לפי סוג ישות\מזהה:
GET Users GET Clients/123 DELETE Doctors/456
ויחזירו קודים מובנים, כמו
200
עבור success ו-404
עבור not found.
כך שה-API אמור להיות אינטואיטיבי.ב-CRUD פשוט הכל טוב ויפה, עד שמגיעים לפעולות קצת יותר מורכבות, בהם לא ברור כל כך איך להיות RESTful "טהור".
לדוגמא: עדכון חלקי של רשומה (מישהו אי פעם השתמש ב-PATCH ?), שיוך ישות-צאצא לישות-אב (האם הנתיב של פעולת שיוך מטופל לרופא, צריך להיות PUT Doctors/1/Patients/4 או אולי PUT Patients/4/Doctors/1 ?)כיוון ש-REST הוא לא ממש סטנדרט, כמו ש@dovid הזכיר, הכאוס חוגג וכל אחד מעקם את הכללים כרצונו, מתכנת מתחיל יכול ליצור API endpoints מוזרות, כמו:
POST Doctors/delete?doctorid=123 GET Doctors/all GET Doctors/2/delete
ולשאלתך, דוד כבר ענה לך שלפי הספר הדרך היא ב.
-
יצירת מסנן לדו"ח באקסס עם תנאים@hp079 אפשר.
הואיל ואתה רוצה להבין את התהליך, אתן לך את הכיוון, ומשם תוכל להמשיך לבד.
בתחביר פתיחה של דוח, ניתן להגדיר מסנן או תנאי:OpenReport ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs
מה שצריך זה לבנות בקוד את התנאי באופן דינאמי כמחרוזת, ואז לפתוח את הדוח עם התנאי.
לדוגמא:Dim DynamicCondition As String DynamicCondition="" ' Add first condition If (Not IsNull(chkSet_ok)) Then DynamicCondition="Ok=" & CStr(chkSet_ok) End If ' Add second condition: If (Not IsNull(chkDone)) Then DynamicCondition=IIF(Len(DynamicCondition)>0, DynamicCondition & " AND ", "") & "Done=" & CStr(chkDone) End If ' Add more conditions If (Only_Bar_Mitsva) Then DynamicCondition=IIF(Len(DynamicCondition)>0, DynamicCondition & " AND ", "") & "Age>=13" End If ... ' Open report with all my conditions: DoCmd.OpenReport "MyReport", acViewNormal, WhereCondition:=DynamicCondition
-
מאקרו שכותב מאקרו אחרזה לא מפתיע שזו תהיה התוצאה. יש כאן רצף של בעיות:
- הקוד מנסה למחוק את הקלאס של
גיליון1
, אני בספק אם בכלל אפשר למחוק קלאס כזה. - גם אם כן, בודאי שאי אפשר להריץ קוד כזה מתוך
גיליון1
. זו תהיה התאבדות... - יתכן ושם הקוד של
גיליון1
הוא בכללSheet1
... - כיון שפעולת המחיקה לא הצליחה, ממילא פעולת ההוספה יוצרת מודול חדש עם השם החדש
גיליון11
, כברירת מחדל במקרה שכבר קייםגיליון1
. - אגב, האם אתה באמת רוצה למחוק את כל הקוד שכבר קיים ב
גיליון1
?
נראה שהאופציה העדיפה כאן היא להוסיף שורות חדשות, על ידי המתודה
AddFromString
:Sub AddStringToSheetModule(sheetName As String, codeText As String) With ActiveWorkbook.VBProject.VBComponents(Sheets(sheetName).CodeName).CodeModule .AddFromString codeText End With End Sub
ואתה קורא לקוד כך:
AddStringToSheetModule "גיליון1", "Dim foo As String" + vbNewLine + "Dim bar As String"
הערות:
- כדי לייבא קובץ טקסט שלם, תקרא אותו לתוך המחרוזת.
- אין כאן שום בדיקות תקינות, האם הגליון קיים, והאם הקוד עדיין לא קיים במודול, וכו'
- הקוד מנסה למחוק את הקלאס של
-
כיצד לשלוף מידע משתי טבלאות הנמצאות בשרתים שונים - SQL@mekev נראה לי שהייתי שולף מכל אחד את הנתונים הרלוונטיים בלבד, ואח"כ משתמש ב-Linq כדי לבצע שאילתה לאחד את הנתונים.
לתצורה שתיארת, זה פתרון יחסית קל. הפתרון היותר מסובך הוא ליצור שרת נתונים אחד שאחראי על איסוף הנתונים משאר השרתים, ולבצע קריאות רק אליו.לגבי עמודות מחושבות, הקו המנחה שלי בד"כ הוא לא להשתמש ב-db לביצוע חישובים בכלל. מאותה הסיבה שבגללה אני מפריד את פיסות הנתונים של החישובים מעיקרא ב-db. את כל החישובים אני מבצע בתוכנה. אני משאיר ל-db את האחריות לטפל באחסון, ארגון, ושליפה של הנתונים. בזה הוא הכי טוב.
-
מסד נתונים כטבלא בשני ממדים@שואף אתה בעצם מבקש ליצור טבלת ציר. לא ידוע לי שיש פונקציית
PIVOT
ב-MySQL, לכן צריך להתחכם ולשרשר כמה משפטיCASE
ברצף.
כדי לקבל את שם העמודה בכל פעם, יש ליצור את נוסח המשפט באופן דינמי עבור כל ערך, ואז להשתמש בGROUP_CONCAT
:SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'SUM(CASE WHEN name = "', name, '" THEN price ELSE 0 END) AS ', name) ) INTO @sql FROM AZMANOT; SET @sql = CONCAT('SELECT monthYear, ', @sql, ' FROM AZMANOT GROUP BY monthYear'); SELECT @sql; PREPARE t FROM @sql; EXECUTE t; DEALLOCATE PREPARE t;
-
שליפת סיומת קובץ - לפי שם הקובץ (C#)@mekev שימוש בשמות אובייקטים בעברית הוא פרקטיקה גרועה מאוד, וגם מקשה על מתן התשובה. סליחה שאני עונה שלא לעניין, פשוט התרשמתי שאתה כבר לא מתכנת מתחיל...
-
נגישות בתבנית בוטסארפ@יוסף-בן-שמעון אם תגדיר את גודל הכתב של כל הצאצאים ביחידות יחסיות
rem
, אז כשתשנה את המאפייןfont-size
שלbody
, כל הצאצאים שלו ישתנו בהתאמה.
דוגמא -
שאלה | איזה משתנה מחזיר את שם השולח בגוגל סקריפט?@חייםיודלביץ אני אענה בשאלה תיאורטית.
אם אני פותח חשבון גוגל ולא מכניס פרטי שם שולח, רק את המייל שלי, האם יש לך דרך לגלות מה שמי?
(אני מקווה שלא...)