שלח תשובה

זירת השאלות

54 תשובות

  1. אוריקס הגיב:

    לא נעים להגיד
    אבל מאמר גרוע

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

    ולשאלתינו: שדות כמו sortID או OrderID הם מיותרים ונועדים למתכנת עצלן שקשר לו לרשום padding.

  2. ניר טייב הגיב:

    כמו שחשבתי רק רציתי להיות בטוח
    תודה

  3. ניר טייב הגיב:

    חלוקה לעמודים
    שיטות חלוקה לעמודים .

    הערה: אני מתייחס פה רק ל-ACCESS ול-MSSQL

    1. שימוש ב-SELECT TOP בשילוב תת שאילתא:


    sql = "SELECT TOP 15 <fields> FROM <tables> WHERE tbl.fldID NOT IN (SELECT TOP "&(15*pageId)&" fldID FROM tbl ORDER BY fldID [DESC/ASC])"
    rs.Open(sql , objConn)

    2. לא ניתן לבצעו באקסס. שימוש ב-SQL דינמי ע"י הכנסת השאילתא למשתנה ומימושה ע"י EXEC


    CREATE PROCEDURE spPagging(@pageId int, @numOfRecInPage int)
    AS
    DECLARE @strSQL varChar(300)
    SET @strSQL = ‘SELECT TOP ‘&@numOfRecInPage&’ <fields> FROM <tables> WHERE tbl.fldID NOT IN(SELECT TOP ‘&(@numOfRecInPage*@pageId)&’ fldID FROM tbl)’
    EXEC (@strSQL);

    3. חלוקה לעמודים ברמת ה-MSSQL / מאת הילדה בלבן
    http://www.webmaster.org.il/showArticle.asp?id=62

    4. ברמת ה-ASP :
    עמוד ראשון – שליפה של מס’ הרשומות הנדרשות


    SELECT TOP 10 <fields>, fldID FROM tbl

    בכל עמוד שעוברים מעבירים את ה-ID האחרון שנשלף ב-query string ומבצעים את השאילתא הבאה:


    sql = "SELECT TOP 10 <fields>, fldId FROM tbl WHERE fldID>"&cInt(Request.QueryString("lastId"))

    אפשר לייעל זאת ע"י כך שנשים את השאילתא השנייה בתוך SP ונשלח פרמטר lastId שישמש אותנו להעברת ה-ID האחרון שהנמצא ב-QS


    ACCESS:
    PARAMETERS p_lastId int;
    SELECT TOP 10 <fields>, fldId FROM tbl WHERE fldId>[p_lastId];

    קריאה מה-ASP
    sql = "EXECUTE spName @p_lastId="&cInt(Request.QueryString("lastId"))
    rs.Open(sql, objConn)

    MSSQL:

    CREATE PROCEDURE spPagging(@p_lastId int) AS
    DECLARE @strSQL varChar(300)
    IF @lastId=0 THEN
    SET @strSQL="SELECT TOP 10 <fields>, fldID FROM tbl"
    ELSE
    SET @strSQL="SELECT TOP 10 <fields>, fldId FROM tbl WHERE fldID>"&@lastId
    END IF
    EXEC(@strSQL)

    קריאה מה-ASP:
    sql = EXECUTE spPagging EXECUTE @p_lastId="&cInt(Request.QueryString("lastId"))
    rs.Open(sql, objConn)

    וילדה אל תעירי לי על ה-@ במשפטי ה-EXECUTE שמבוצעים על ACCESS כי בלעדיהם ה-EXECUTE לא עובד (לפחות אצלי)

  4. ניר טייב הגיב:

    regExp
    במערכת החדשות שאני בונה אני בודק אם ה-ID שנשלח ב-QS הוא מספר
    אז אני בודק אם הוא נשלח ו/או מבצע עליו את regExp שבודק האם הוא מכיל אותיות
    אם הוא עונה על אחד מהתנאים אני שולח אותו בחזרה לעמוד אינדקס הכתבות

    if (artId=="NaN" || /*[a-z]*/gi.test(artId))
    Response.Redirect("index.asp?pageId=1");

    הבעיה היא שגולש עדיין יכול להכניס לי תווים ב-QS שהם לא מספרים ולא אותיות (כמו & ו-" ; ") ואז תתקבל שגיאה (שאני רוצה למנוע)
    איך אני משדרג את ה-regExp כשלי כך שהוא לא יאפשר גם תווים מיוחדים (לדוגמאת : "&", ";")

    /*[a-z]*/gi

  5. ניר טייב הגיב:

    [ללא נושא]


    var artId = Request.QueryString("id"), rExp=/D*/gi, rExp1=/d*/gi
    if (artId=="NaN" || (!rExp.test(artId) && rExp1.test(artId)))
    Response.Redirect("index.asp?pageId=1");

    יש פיתרון יותר טוב? אשמח לשמוע

  6. ניר טייב הגיב:

    קודם כל parseInt
    אפשרי במשפט IF לבדוק האם הערך הוא מספרי ע"י הסבתו?

  7. לא מעירה
    הבעיה עם ה-@ היא בתוך ה-SP ולא בקוד ה-ASP.

  8. ניר טייב הגיב:

    תאריכים לפי אזורים (ל-FAQ )
    שאלה
    איך מחזירים את התאריך שנמצא באובייקט התאריך ב-JS כתאריך שלם בשפה האזורית?

    תשובה
    משתמשים בשיטה toLocaleString() של אובייקט התאריך

    var todayDate = new Date()
    alert(todayDate.toLocaleString());

  9. BuildHome הגיב:

    יש פונקציה הבודקת אם הוא שווה לערך
    מספרי.

    דוגמא:

    <%
    ID = Request.QueryString("ID")
    If IsNumeric(ID) Then
       OK
    Else
       Error!
    End If
    %>

    מקווה שלזה התכוונת

  10. ניר טייב הגיב:

    מכיר :- אבל אני עובד על JS
    ואים פונקציה כזו ב-JS

  11. sirob הגיב:

    יש את isNan….
    זה מה שאתה מחפש?


    isNan()

  12. sirob הגיב:

    הדפסת תאריך בצרפתית
    או בכל שפה שרוצים, למעשה… VBscript צד לקוח:
    קובץ מצורף…

  13. ניר טייב הגיב:

    חיפוש פנימי
    במערכת החדשות שאני עושה באתר אני מאפשר למשתמש לעשות חיפוש פנימי בתוך כתבה (ע"י JS ו-DHTML) הסימון עובד והחיפוש מתבצע כיאה.
    אז בעצם ככה הולך הסקריפט שלי
    מקבל משדה קלט (Input) מסוים את הערכים לחיפוש ומפצל אותם איפה שיש ערכים ריקים (ע"י regExp : /s/g) למערך. לאחר מכן מאתחל שני משתנים strArticle ו-strArticleCng ומציב בהם את ה-HTML של הכתבה (ע"יinnerHTML).
    מבצע לולאה על על המערך של מילות החיפוש ועושה replace איפה שצריך במשתנה strArticleCng (ממרקר את הטקסט שחופש בצהוב).
    לאחר מכן משווה בין שני הערכים של המשתנים strArticle ו-strArticleCng
    ואם הם שווים (סימן שלא חל שינוי ושלא נמצא שום הערך המבוקש) אז מופיע alert שכתוב בו " לא נמצאו תוצאות"
    ואם הם שונים (סימן שכן נמצא) זה פשוט מכניס את הערך החדש בתוך ה-DIV


        var strToSearch=""+document.getElementById("search").value, strArticle=""+document.

    getElementById("Content").innerHTML, strArticleCng;

            case "by word":
                strToSearch= strToSearch.split(/s/g);
                var strArticleCng1 = strArticleCng;
                strArticleCng = strArticle;
                for (var i=0;i<strToSearch.length;i++)
                    strArticleCng = strArticleCng.replace(new RegExp(strToSearch[i],"gi

    "),"<span style="background-color:yellow;"> "+strToSearch[i]+" </span>");
                    if (strArticleCng1==strArticleCng) alert("לא נמצאו תוצאות");
                    else document.getElementById("Content").innerHTML = strArticleCng;
            break;

    (אל תתיחסו לזה שאין SWITCH כי זה רק חלק מהקוד)
    הטקסט מסומן כשזה מוצא אבל אם זה לא מוצא אז שום דבר לא קורה ואין ALERT

    איך אני פותר את הבעיה תודה (ניסיתי כל מיני דברים והם לא עבדו)

  14. אוריקס הגיב:

    אפשר, אבל לא צריך…

    var x="nir";
    alert(isNaN(x));//not a number
    x="123";
    alert(isNaN(x));//number

  15. ניר טייב הגיב:

    ועוד שאלה
    יש איזה שהיא פונקציה ב-JS שהופכת תווים ל-ASCII שעובדת עם regExp ?

  16. ניר טייב הגיב:

    טוב לא חייב שתעבוד עםregExp
    והכוונה הייתה שאחד הפרמטרים שלה יהיה ביטוי רגולרי (new RegExp)
    העיקר שתהפוך קבוצת תווים ל-ASCII אני פשוט רוצה להפעיל את ה-regExp הבא:

    rExp = /W/g

  17. sirob הגיב:

    הפכת שתי שורות:

                var strArticleCng1 = strArticleCng;
                strArticleCng = strArticle;

    צריך להיות:

                strArticleCng = strArticle;
                var strArticleCng1 = strArticleCng;

  18. ניר טייב הגיב:

    בקשר למאמר של deviation
    לפי מה ש-deviation אומר במאמר חלק ב’ אפשר להסיק שכל הלולאה שאנו עושים על הרקורדסט היא לא רצויה (ובכלל על מערך getRows)
    כי זה מעין מעבר ליניארי על כל השדות שנצאים במסד.
    אז אם זה כך יש פיתרון אחר?

  19. אוריקס הגיב:

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

    הבעייה מתחילה להסתבך, כשעל כל פעם שאתה עובד, אתה עובד עוד פעם, ועוד פעם… ואז ה n מקבל חזקה.

    במקרה שלך – סיבוכיות זמן הריצה תלויה ברמה הכי ארוכה בעץ. הסיבוכיות שלך ברקורסיה היא O(n^x) כשה X הוא הרמה הכי עמוקה בעץ. וזה _מאד_לא_יעיל.

  20. ניר טייב הגיב:

    לא דיברתי על רקורסיה
    דיברתי בכלליות
    תודה על ההסבר

  21. אוריקס הגיב:

    הרקורסיה הייתה דוגמא
    לאלגוריתם עם סיבוכיות גבוהה

  22. ניר טייב הגיב:

    הצלחתי לשפר ביצועים (יש)
    1. לולאה על getRows יצאה יותר מהירה מלולאה על הרקורדסט (כשיש רשומה אחת )
    2. אני עושה חלוקה לדפים בעזרת not in ותת שאילתא (כמו שיש כאן באחת מההודעות הקודמות בשרשור) כדי לעשות דפדוף עלי לעשות שליפה חוזרת של מס’ הרשומות שיש לי במסד (ע"י פונקציית COUNT) . אז לפני הדפדוף בדקתי אם צריך בכלל לדפדף (אם ה-rs.recordCount קטן מ-10 במקרה שלי)(או לפי אורך המערך ((arr.length<10*cntFields+cntFields)-(ע"פ השיטה שלי למערכי getRows)) ואם לא צריך אז שפשוט לא יופיע הדפדפוף (ה-SELECT של הדפדוף נעשה בצד הלקוח בסקריפט JS כאשר מס’ הרשומות מועברות כפרמטר לפונקציה )

  23. ניר טייב הגיב:

    getRows שיפר את הביצועים
    ב-60 עד 100 מילישניות
    והדפדוף ב-60

  24. sirob הגיב:

    כמה זמן לוקח כל העסק? לכמה רשומות?
    זה נשמע כמו המון זמן….

  25. ניר טייב הגיב:

    רשומה אחת היית מאמין ?!
    המסד בנוי נכון ומסודר כמו שצריך.
    העסק עצמו לקח כ-150 ms בטעינה ראשונה לפני שיפור הביצועים לאחר השיפור 50 ms(דפדוף ו-getRows)

  26. ניר טייב הגיב:

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

  27. ניר טייב הגיב:

    בלי הדפדוף
    100 ms
    וכשיש 16 רשומות ומתוכן נשלף רק 10 אז 600 ms לדעתי זה שיפור ביצועים  
    ודרך אגב כך נראית השאילתא שלי:

    SELECT TOP 10 articles.artId, articles.artSubject, (RIGHT(articles.strArticle,250) & IIF(LEN(articles.strArticle)>250,"…","")) AS str80Article, articles.publishDate, Writers.writerName
    FROM articles INNER JOIN writers ON articles.writerId=writers.writerId
    ORDER BY articles.artId DESC;


    בעמוד הראשון

  28. sirob הגיב:

    זה ***המון*** לדעתי…
    ניסית פתרון של FSO? זה ייקח משהו כמו 50ms להכל (מנסיון העבר)…

  29. ניר טייב הגיב:

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

  30. ניר טייב הגיב:

    בטעינה ראשונה!
    לאחר שאני עושה refresh זהי יורד ל-100 ואז ל-60

  31. אוריקס הגיב:

    עזוב טעינה ראשונה
    דפי ASP לא מתקמפלים בכל פעם שמתבצעת בקשה

  32. ניר טייב הגיב:

    זו טעות
    הבאתי נתונים של העמוד הלא נכון
    זה טוען ישר על 100 ms זה כבר יותר נורמלי ?!

  33. sirob הגיב:

    אם לא הולכים על תעינה ראשונה זה
    צריך להיות באזור ה-0.020 שניות. לא הרבה יותר.הדפים שלי עולים ב-0.008 בפעם השניה.

    0.100 זה סביר, אבל לא בשביל 16 רשומות….

  34. ניר טייב הגיב:

    שמע…
    הדפים שלי עולים לפעמים 0.1 לפעמים 0.08
    אתה בעצם אומר שהעמוד שלך עולה תוך 8 מאיות שנייה(שיא)
    מה יש בו כבר?!
    שאילתא בעמוד הראשון (שלוקח לו בין 0.07 ל-0.1 שניות לעלות):

    SELECT top10Articles.artId, top10Articles.artSubject, top10Articles.str80Article, top10Articles.publishDate, top10Articles.writerName FROM top10Articles WHERE catId=1

    שקורא ל-VIEW

    SELECT TOP 10 articles.artId, articles.artSubject, (RIGHT(articles.strArticle,250) & IIF(LEN(articles.strArticle)>250,"…","")) AS str80Article, articles.publishDate, Writers.writerName, articles.catId
    FROM articles INNER JOIN writers ON articles.writerId=writers.writerId
    ORDER BY articles.artId DESC;


    לאחר מכן לולאה על getRows

    לאחר מכן עוד שאילתת COUNT לדפדוף

    SELECT Count([artId]) AS cntId
    FROM articles;

    בעמוד אחרים שבחלוקה(השאילתא של הצגת הכתבות בעמוד 2):

    SELECT TOP 10 articles.artId, articles.artSubject, (RIGHT(articles.strArticle,250) & IIF(LEN(articles.strArticle)>250,"…","")) AS str80Article, articles.publishDate, Writers.writerName FROM articles INNER JOIN writers ON articles.writerId=writers.writerId WHERE articles.artId NOT IN(SELECT TOP 15 articles.artId FROM articles ORDER BY articles.artId DESC) AND articles.catId=1 ORDER BY articles.artId DESC

    והדפדוף עדיין נשאר

  35. ניר טייב הגיב:

    גיליתי ששאילתת ה-COUNT
    מכבידה על עליית העמוד ב-10 עד 40 (ms)

  36. sirob הגיב:

    האובייקט ASPProfiler עובד מעולה.
    הדף שלי מבצע לולאה אחת 165 פעם, וכל הלולאה לוקחת 10 מילישניות.

    הדף כולו עולה ב-31 מילישניות, כשקריאת הנתונים באופן מעשי לוקחת כ-5 מילישניות. הכל עם FSO כמובן.

  37. ניר טייב הגיב:

    אני משתמש ב-DB כדי ליצור
    חלוקה לעמודים נאותה וגם חיפוש
    ב-FSO צרילך לפתוח ולסגור את הקובץ

    ואנו עובדים בשתי שיטות שונות אז כבר אי אפשר להשוות
    אתה עם FSO ואני עם DB

  38. ניר טייב הגיב:

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

  39. ניר טייב הגיב:

    למה? כי הקישור למאמר נמצא בעמוד זה?

  40. אוריקס הגיב:

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

  41. ניר טייב הגיב:

    האמת שזה לא לאתר שלי
    אני בונה את המערכת לאתר אוונסנס הישראלי

שלח תשובה