API באקסס
-
@דוד ל.ט.
שאר הפריטים בפרוייקט הם משתנים, ובמקרה שלך נמתקד בשתיים:
app.xaml שמייצג שתי קבצים: אחד כשמו app.cs ובן זוגו app.xaml.cs
MainWindow.xaml אותו דבר, מייצג קובץ נוסף ששמו MainWindow.xaml.csאז שתי הפריטים האלו כעת יהיו בפוקוס שלנו. הראשון (app) הוא אחד לכל "אפליקציית WPF" שזה סוג הפרוייקט בו התחלנו.
הפריט הזה למעשה מייצג מחלקה (תכף אפרש מה זה מחלקה) בשם Application שהיא מנהלת את האפליקציה - היא גם נקודת ההתחלה של התוכנית כשהיא רצה.השני, הוא מייצג את החלון שרואים כשמקישים F5. יכולים להיות כמה סוגי חלונות באפליקציה (כל סוג יכול להופיע כמה פעמים שרוצים בחיי האפליקציה אבל הסוג הוא אותו אחד). בפרוייקט שלנו יש רק אחד והוא הראשי - א. נטען אוטומטית בהפעלת התוכנה (לאפוקי האחרים שנטענים רק כשתכתוב קוד לטעון אותם) ב. סגירתו סוגרת את התוכנה כולה. שמו מסמל על כך כי main זה ראשי.
פתח את הקוד של MainWindow.xaml.cs ונתחיל לשחק.
הקוד נראה ככה (כמעט), חסר קצת בהתחלה כמה שורות:using System.Windows; namespace ProjectName { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } }
יש בקוד הזה כמה מקטעים. אין צורך להבין כלום בינתיים, אבל אני לא אמנע מסיקור עיתונאי:
הקטע הראשן זה using שזה טכניקה לקיצור הקלדה (בקוד שלי מחקתי את רובם, בשביל שייכנס פה בקלות).
אח"כ מגיעים בלוקים - קטעים שמתוחמים ע"י {} שזה המקבילה של C# לEnd של VB.
הבלוקים האלה, 3 במספרם, הם שלושה סוגים. האב הוא namespace שזה טכניקה לסידור נוח של הקוד שקשורה לusing דלעיל, הבן class זה מחלקה (שזה אבן הבניין של C#) אני אסביר על זה בהמשך. הבלוק הכי פנימי זה מתודה (sub של VB) מסוג בנאי (counstractor) - שוב, אל תנסה להבין כי זה לא חשוב כעת.כעת תשכח את כל ההקדמות העיתונאיות וניגש לתכלס:
בC# אין משמעות לשורות. כלומר מבחינת הביצוע תוכל לכתוב את כל הקוד בשורה אחת (ברררר..). מה שמפריד בין פקודה לפקודה זה נקודה פסיק (;) אם היית יודע כמה אלפי שורות קוד כתבתי בVB ואיך היה קשה לי להתרגל...
נכתוב שורה ראשונה, תשים שורה חדשה תחת שורה 12, ותכתוב שמה:Title = "מתי נתחיל כבר לעשות משהו עם מסדי נתונים";
תריץ (F5 או הסמל הירוק בסרגל הכלים) ותעדכן אותי שאתה אחרי.
פורסם במקור בפורום CODE613 ב31/03/2017 00:52 (+03:00)
-
OK
תודה!פורסם במקור בפורום CODE613 ב31/03/2017 10:56 (+03:00)
-
כעת נעשה כמה שלבים ברציפות:
א. נקבע משתנה. בVB כותביםdim shem_sheba_li as string
וזה אומר שהקצנו מזהה לישות מסוג "מחרוזת תווים". המזהה הוא "shem_sheba_li" והמילה dim היא מילת מפתח שמשמעותה הצהרת מזהה חדש.
בC# כותבים בדרך אחרת:string shem_sheba_li;
בלי הצהרה אין משתנה (בשונה מאפשרות שהייתה בVBA).
אחרי שהצהרנו, אפשר להציב בו ערךshem_sheba_li = "טקסט.... ממש ממש מיוחד";
אחרי שהצבנו בו ערך ניתן להשתמש בו כערך להשמה במאפיין Title דלעיל שמקבל כערך string:
Title = shem_sheba_li;
כעת נעיז ונלמד על פונקציה. בC# אין sub (פרוצדורה) וfunction, אלא הכל אותו תחביר.
מה ההבדל בVB בין sub לfunction? ההבדל היבש הוא שfunction יכול להחזיר ערך, וsub לא.
בC# בשביל לציין פונקציה מציינים ככה:
כותרת עם א. ערך מוחזר (מספר או קטסט) ב. שם שמזהה את הפונקציה ג. סוגרים שבהם יכולים להיות 0 או יותר ארגומנטים
אחרי זה בלוק {} שבתוכו יכולות להיות כמה משפטים (שורה הנגמרת בנקודה פסיק) שעושים כל מה שרוצים, חייבת להיות בכל מקרה החזרת ערך תואם למה שהוצהר בכותרת.
דוגמא:string my_first_function() { return "הערך המוחזר"; }
כתבתי בשורה אחת לנוחות.
הפקודה return מחזירה ערך ומסיימת את הפונקציה. אחרי מגיע טקסט שזה string וזה תואם את מה שהצהרנו שmy_first_function מחזיר מחרוזת תווים (למה "מחרוזת תוים" ולא סתם טקסט? מה זה האקדמאיות הריקה הזו? עוד תלמד לראות שזה פני המציאות ולא מילים גבוהות ריקות אבל עוד חזון למועד - בתכלס תוכל להגיד טקסט).איך כותבים פרוצדורה = sub = בלוק פקודות שלא מחזיר שום ערך? אותו דבר כמו פונקציה רק במקום ערך מחזר כותבים void שמשמעותו כלום.
אז נכתוב כעת כזו פונקציה:void ktov_koteret() { Title = "טקסט זה הוצב ע\"י פונקציית void"; }
(הקו הלוכסן מבטל את המשמעות של המרכאות כסיום מחרוזת).
תוסיף את השורה האחרונה מתחת לבלוק של public MainWindow(),
ותחליף או תוסיף מתחת לשורה שכתבנו קודם (בפוסט הקודם), בשורה הזו:ktov_koteret();
תריץ ותבדוק שהכל הולך טוב. אם כן נתקדם (שאלות בשמחה, אבל רק על מה שלמדנו לא על איך לעשות או על המשך הלימוד)
נוסיף לפונקציה שלנו ארגומנטים כך שהיא תיראה ככה:void ktov_koteret(string parameter_ma_lasim_bakoteret) { Title = parameter_ma_lasim_bakoteret; }
ואת שורת הקריאה תשנה לככה:
ktov_koteret("זה כבר העברת רך כפרמטר");
שים לב שהצהרת ארגומנט דומה להצהרת פונקציה: סוג ערך שאחריו מגיע מזהה לשימוש עם הערך בגוף הפונקציה.
כעת נערבב מה שלמדנו:public MainWindow() { InitializeComponent(); string po_ani_sam_text; po_ani_sam_text = "מתי נתחיל כבר לעשות משהו עם מסדי נתונים"; shimuy_coteret_hachalon(po_ani_sam_text); } void shimuy_coteret_hachalon(string parameter_kolsheu) { Title = parameter_kolsheu; }
כעת שאלות אם יש, ו/או אישור התקדמות.
פורסם במקור בפורום CODE613 ב31/03/2017 12:03 (+03:00)
-
OK
פורסם במקור בפורום CODE613 ב31/03/2017 12:19 (+03:00)
-
האות הראשונה כן.
(כך לפי איזה ספר שאני קורא תוך כדי)
הרבה יתקן אותי אם אני טועה?פורסם במקור בפורום CODE613 ב31/03/2017 12:35 (+03:00)
-
זה המוסכמות של כתיבת משתנים בסישארפ? עם קו תחתי ואותיות קטנות?
לא, אלא אני מגוון לנוחות.
לפי המוסכמות (שמאוד מאוד עוזרות ואני אכן כותב על פי הם) הפרדה בין מילים ע"י אות גדולה, במשתנים פונקציות וכל מזהה חוץ מקבוע (ששם הכל גדול וההפרדה היא קו תחתי). בקש לאות ראשונה היא תמיד גדולה למעט משתנים מקומיים/פרטיים.
פורסם במקור בפורום CODE613 ב31/03/2017 13:16 (+03:00)
-
@מצפה לגדול
OK
מעולה! אתה הולך מצויין.
אני לא אמשיך היום בגלל שבת קודש וערבו של חג.
כנראה יום ראשון, נצלול כבר ישר לתוכנית הרצוייה לך ואז נחזור ללימוד, אז יעזור אם תתן קוים כלליים מה נחוץ לך בסיפור של הAPI.
אל תירד לרזולוציה איך זה ייעשה אלא תתמקד בחזון, למשל: "יש לי טבלה של סוגי דגים ואני רוצה שהמחשב יכתוב בטבלה אחרת על כל דג כמה פעמים הוא מופיע בים". או דוגמה מתאימה יותר לענייננו "יש לי טבלה עם שמות קבצים ואני רוצה שהמחשב יעלה כל קובץ לAPI מסויים ואז יכתוב את התוצאה בטבלה".פורסם במקור בפורום CODE613 ב31/03/2017 13:18 (+03:00)
-
תודה רבה!!
יש לי בימות המשיח מערכת שמוכרת מוצרים, ואני צריך שהיא תקריא את הנתונים.
בניתי קובץ באקסס שמוריד את הקובץ משם, ומכניס אותו לטבלה.
עכשיו הוא לכל רשומה מוציא פלט שכתוב: X הזמין Z מוצרים. ס"ה לתשלום Y.
את הפלט הזה הוא מייצא לקבצי XXX.tts (קבצי הקראה בעברית ע"י רובוט במערכות 'ימות').
את זה אני צריך להעלות לבד בFTP.אני רוצה שיהיה סקריפט שעושה את כל זה בלחיצת כפתור.
ואולי אפ' אוטומטי כל כמה דקות (ונשאיר מחשב דולק)הבעיה שבגללה אייתיתי להכא (תרתי משמע, גם לפורום, וגם לC#), שההעלאה לא עובדת.
זה אמור להראות כך:https://www.call2all.co.il/ym/api/UploadFile?token=XXXXXXXXXXXXXXXX&path=1.tts
אבל אני לא יודע איך לשים את הקובץ עצמו.
ניסיתי file=, ולא עבד.
נסיתי גם להעלות דרך תוכנה של RESET (תוסף לכרום בשם Advanced REST client), ולא עבד.יש להם טופס שמאפשר להתנסות בזה, ושם זה כן עובד.
בכתובת: https://www.call2all.co.il/ym/api_upload_test.phpושוב תודה רבה!!
פורסם במקור בפורום CODE613 ב31/03/2017 13:48 (+03:00)
-
הם לא נוצרים, יש קובץ אחד שמתעדכן בכל פעולה.
פורסם במקור בפורום CODE613 ב31/03/2017 14:33 (+03:00)
-
טוב... בזה כבר אני מבין.
זה חברה שמאפשרת תפעול חינמי של מערכת תוכן (IVR) טלפונית.
היא נפתחה לראשונה ע"י יהודי חב"די שהקים את קו "נחייג ונשמע" של חב"ד, ואח"כ הורחבה למערכות תוכן חינמיות, ומכאן השם המעניין.
רוב קווי הווצאפון וכו' שלהם.
ויש אפשרות לתכנות חלקי של המערכות.פורסם במקור בפורום CODE613 ב31/03/2017 15:03 (+03:00)
-
רק בשביל לעצבן את דוד
אני כותב דוגמא איך מבצעים את העלאה הזאת בקלות ב nodejs.const fs = require("fs"); const request = require("request"); var formData = { token: 'token', path: '1.tts', upload: fs.createReadStream('1.tts'), convertAudio: '1' }; request.post({ url:'https://www.call2all.co.il/ym/api/UploadFile' , formData: formData , json: true }, function optionalCallback(err, httpResponse, body) { if (err) { return console.error('upload failed:', err); } console.log('Upload successful! Server responded with:', body); });
פורסם במקור בפורום CODE613 ב01/04/2017 20:50 (+03:00)
-
וזה עבד לך?
(ח"ו לא לעצבן אף אחד)פורסם במקור בפורום CODE613 ב01/04/2017 21:13 (+03:00)
-
נכון. אבל למה באתי לפה, כי זה לא עובד.
https://www.call2all.co.il/ym/api/UploadFile?token=XXXXXXXXXXXXXXXX&path=1.tts&upload=Yemot
אני מנסה את זה, בדפדפן, וזה לא עובד. מישהו יודע איפה הטעות?
או: מה הפרמטר של הקובץ עצמו, ובאיזה צורה.
אם אתה רוצה טוקן, אני יכול לתת לך, השאלה איך.פורסם במקור בפורום CODE613 ב01/04/2017 21:28 (+03:00)