@Y-Excel-Access כתב בכתיבת טקסט בעברית באותיות אנגליות (ללא תרגום מילולי):
כל זה בהנחה שאין VISUAL STUDIO בממשק עברי.
ברוך שהצילנו מעונשו של אולפן חזותי התשפ"ג...
@Y-Excel-Access כתב בכתיבת טקסט בעברית באותיות אנגליות (ללא תרגום מילולי):
כל זה בהנחה שאין VISUAL STUDIO בממשק עברי.
ברוך שהצילנו מעונשו של אולפן חזותי התשפ"ג...
@hp079 כתב ביצירת מסנן לדו"ח באקסס עם תנאים:
DynamicCondition = IIf(Len(DynamicCondition) > 0, " AND ", "") & "agent LIKE %" & "agent" & "%"
יש לך גרשיים מיותרות מסביב למשתנה agent
. אתה צריך לרשום כך:
DynamicCondition = IIf(Len(DynamicCondition) > 0, " AND ", "") & "agent LIKE %" & agent & "%"
כשה-agent
האחרון בשורה מתייחס לשם של פקד תיבת הטקסט בטופס המכיל את שם הסוכן לחיפוש.
@mekev ראשית, ישר כח על הכיון הנכון ועל הדחיפה של @dovid.
אני קצת יותר קיצוני בגישה שלי, ומקווה שזה רק שלב ביניים קצר, ושתקבל באהבה גם את הדחיפה הקטנה שלי לעבור בסוף לשימוש במילים אמיתיות באנגלית, מהסיבות הבאות:
בהצלחה!
@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
ולשאלתך, דוד כבר ענה לך שלפי הספר הדרך היא ב.
@yossiz אני מנסה להבין לאן אתה חותר. ברור לי שאין צורך לומר לך פוק חזי וכו' ואתה מכיר את הדרך המקובלת של RESTful API, על כל היתרונות והחסרונות שלה...
שמא אתה מחפש דרך יעילה ואלגנטית יותר לבצע עדכונים היררכיים ב-API, בסגנון של GraphQL?
@מים-אחרונים כחלק מהכללים הטובים של הפורום הוחלט שלא לאפשר להגיב על פוסט ישן מדי. אחת התועלות בזה היא למנוע מצב שבו יש מידע איכותי אבל הוא לא נגיש בקלות, וצריך לנבור בערימות של קש לא רלוונטי כדי למצוא אותו.
פוסטים קצרים וממוקדים, בתבנית של בעיה-פתרון, הם הרבה יותר שימושיים מאשר שרשור אינסופי שמתמשך על פני שנים.
@מים-אחרונים כתב בחלון שגיאה אין אינדקס:
רק לאיפה נעלם השרשור הידוע שמשם הכרתי אותך, ואת אקסס לעומק?
לא נעלם, הוא עדיין כאן. אני קצת נעלמתי...
@one1010 אתה רוצה ליצור גליון נפרד עבור כל אות, דהיינו שכל השורות שמתחילות באות א' ימוקמו בגיליון 'שורות_א', כל השורות שמתחילות באות ב' ימוקמו בגיליון 'שורות_ב', וכו'?
@hp079 לתיבת סימון תלת מצבית שלושה ערכים אפשריים:
True, False, Null
. הערך Null
משמעותו ללא סימון.
אם אין סימון בתיבה זו, מסתמא הלוגיקה היא לא לסנן לפיה, לכן בשורה:
If (Not IsNull(chkSet_ok)) Then
אתה מוודא שהתיבה מסומנת, כלומר אם היא לא מכילה Null
, ואם כן, השורה:
DynamicCondition="Ok=" & CStr(chkSet_ok)
מוסיפה לתנאי את הבדיקה האם השדה Ok (בדוח) שווה לערך טבלת הסימון.
לא צירפתי דוגמא לבדיקה של תיבות הטקסט, אבל היא אמורה להתבצע באופן כמעט זהה, דהיינו אם ישנו ערך כלשהו בתיבת הטקסט, אז להוסיף תנאי סינון לשדה הרצוי לפי ערך זה.
הנה דוגמא שמסננת את הדוח כך שיוצגו רק רשומות בהן ערך השדה FirstName מכיל את מחרוזת החיפוש שהוקלדה בתיבת הטקסט txtSearchFirstName:
If (Len(txtSearchFirstName) > 0) Then
DynamicCondition=IIF(Len(DynamicCondition)>0, " AND ", "") & "FirstName LIKE %" & txtSearchFirstName & "%"
End If
@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
@סקרן-0 ההצעה שלי לשאילתת עדכון אינה דורשת שינוי במבנה מסד הנתונים, השאילתא נשענת על המבנה הקיים.
אם אתה מורשה להוסיף קוד משלך, מה הבעיה להוסיף שאילתא?
@מים-אחרונים
כאשר שדה מוגדר כשדה אינדקס, זה משפר את יעילות השליפה של הרשומה בהינתן ערך השדה (כי ערכי השדה ממויינים או מגובבים על ידי ה-DB מאחורי הקלעים)
שדה מפתח הוא תמיד מאונדקס על ידי אקסס.
אולי אתה מנסה לקשר בין שני שדות שאחד מהן אינו שדה מפתח.
@סקרן-0
יש כאן בעיה בתכנון לקוי של ה-DB, כי הקשר בין הלקוח לאיש השיווק אמור להופיע בנתונים במקום יחיד בלבד. אין היגיון להחזיק כפילות של הקשר הזה בשתי טבלאות, ולנהל את שתיהן (להוציא מקרים מיוחדים שבהם יש שכפול של הנתון הזה לצורך יעילות, ואז צריך שהקשר יתעדכן במקביל בשני המקומות בו זמנית, כדי למנוע מצב שאין לך מקור אמת יחיד)
המבנה הנכון של ה-DB הוא כך שהקשר יופיע רק בטבלת הלקוחות (במקרה של קשר יחיד לרבים - כשלכל איש שיווק יכולים להיות הרבה לקוחות, אך לכל לקוח יש איש שיווק יחיד בלבד) או בטבלת זוגות (במקרה שהקשר הוא רבים לרבים - כל לקוח יכול להיות משוייך לכמה אנשי שיווק, וכל איש שיווק יכול להיות משוייך לכמה לקוחות).
אני מבין שאין לך אפשרות\ידע\רצון לשנות את המבנה הקיים. זו אכן עבודה מורכבת למדי, ועדיף שתתבצע על ידי המתכנת.
גם אם זה אפשרי לכתוב קוד שמפעיל את הכפתור 10000 פעמים, זה מאוד לא מומלץ, בפרט שמדובר ב-Dlookup.
הפתרון הכי יעיל לעדכון הוא ליצור שאילתת עדכון שמצרפת את טבלת הלקוחות עם טבלת השיוך, ומעדכנת את השדה בכל הרשומות בריצה אחת, זה יעיל פי 10000.
@pancake אם אתה מדבר על SqlServer בדווקא, הוא מבוסס שרת, כך שאי אפשר לגשת לקובץ הדאטא בלי מנוע ה-Server. אכן אפשר למקם את קובץ הנתונים שלו במיקום ברצונך, ולהפנות אליו על ידי פרמטר במחרוזת החיבור:
AttachDbFilename=D:\MyApp\AppData.mdf;
(אפשרות אחרת היא להשתמש ב-DB של SqlLite שהוא SelfContained (לא מצריך התקנת שרת), ומאוחסן כקובץ יחיד. אמנם אין בו את כל האפשרויות שמגיעות עם SqlServer כמו StoredProcedures.)
לגבי חסימת הגישה, למי שיש גישה ל-ConnectionString תהיה כמובן גם גישה לנתונים. אם תגן על ה-DB בעזרת סיסמה מורכבת, ותשמור את מחרוזת החיבור בצורה מאובטחת, למשתמש הפשוט לא תהיה גישה לנתונים.
בסוללות נטענות יש שתי בעיות:
אני משתמש יום יום כ-3 שעות במיקרופון עם משדר רדיו כדי שאוכל להתנייד.
המשדר משתמש בשתי סוללות אצבע, ורציתי לחסוך הטענות רצופות.
אחרי מחקר קטן, קניתי מחו"ל 2 רביעיות של Panasonc eneloop pro.
הם יקרות, אבל מדהימות...
פתחתי חבילה אחת והתחלתי להשתמש בשני הזוגות שבה לסירוגין, כשזוג אחד נגמר, אני מטעין אותו ומשתמש בשני. אני משתמש באותה חבילה בערך 5 שנים והחבילה השנייה עדיין סגורה.
מבחינתי זו הייתה קנייה מוצלחת ביותר, ממליץ למי שצריך שימוש יום יומי, רק להיזהר מחיקויים זולים.
@A0533057932 אם הכוונה היא שלא תופיע אפילו נוסחא בשורת הנוסחאות, אז אפשר ליצור טריגר בארוע שינוי של תא הקלט, שיכניס את תוצאת הנוסחא לתא הפלט.
הנה דוגמא כזו, שעוקבת אחר השינויים בטווח A1:A10
ומשנה את הערך בתא הסמוך בעמודה B
.
(יש להדביק את הקוד באובייקט של הגיליון הרצוי)
Option Explicit
Private Const WatchRangeString As String = "A1:A10"
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range(WatchRangeString), Range(Target.Address)) Is Nothing Then
DoSomething Target
End If
End Sub
Private Sub DoSomething(ByRef ChangedRange As Range)
Dim oldValue As Variant
Dim newValue As String
If (IsEmpty(ChangedRange.Value2)) Then
newValue = ""
Else
oldValue = ChangedRange.Value2
newValue = "Thank you for entering " & CStr(oldValue)
End If
Me.Cells(ChangedRange.Row, ChangedRange.Column + 1).Value = newValue
End Sub
תוצאה:
כמובן שבמקרה שלך, אתה צריך להחליף את הערך בשורה 20 בקוד לתוצאה הרצויה (התאריך העברי)
@Y-Excel-Access נראה שנפלה לך טעות קטנה בהקלדה. צ"ל כך:
function RunJS() {
var TEXT = "var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('a5').setValue('Running!');"
eval(TEXT);
}
@Y-Excel-Access לכאורה אפשר על ידי הפונקציה eval()
:
eval("Logger.log('Hello world')")