הגדרת JOIN בSYNTAX המקומי

פורומים אפיון ופיתוח פריוריטי הגדרת JOIN בSYNTAX המקומי

  • Post
    cshames
    משתתף
    שבוע טוב לכולם,

    אני מנסה לכתוב שאילתא שתהפוך בסופו של דבר לדוח שימשוך כמה פרטים מתוך כל הזמנות הרכש המקושרות לחשבוניות ספק, כאשר רשימת חשבוניות הספק מאולצת ע"י תנאי מסויים (בדוגמא למטה תאריך הקלדה). הבעיה היא שאני נאלץ למשוך את ORD הזמנות הרכש משני מקומות, גם מINVOICES.ORD וגם מIVORD.ORD. ברגע שאני מנסה לערב את IVORD השאילתה משתגעת ומנסה לעשות לי חיתוכים 1=1, כאשר זו בכלל לא כוונתי. לא ברור לי הלוגיקה שבה הINTERPRETER בוחר לפרש את תנאי הWHERE שלי להצהרות JOIN או WHERE בשאילתת SQL. דוגמא לקוד ולQUERY שמנסה לרוץ בהמשך.

    השאלות שלי הן:

    1. למה הINTERPRETER מפרש את התנאים שלי ככה? אם בכלל, נראה שיש לי תנאים מיותרים.

    2. האם ניתן להריץ שאילתה שנכתבה בSQL טהור? זה היה פותר לי הרבה צרות.

    3. פידבק על באגים, פאשלות, וחוסר הבנה משווע יתקבל בברכה.

    להלן הקוד האחרון שהרצתי:
    <p style="direction: ltr;">SELECT INVOICES.IVNUM,</p>
    <p style="direction: ltr;">PORDERS.ORDNAME,</p>
    <p style="direction: ltr;">INVOICEITEMSA.TOTPRICE,</p>
    <p style="direction: ltr;">USERS.USERLOGIN,</p>
    <p style="direction: ltr;">INVOICESA.TYPEDDATE,</p>
    <p style="direction: ltr;">INVOICEITEMSA.KLINE,</p>
    <p style="direction: ltr;">PORDTYPES.TYPEDES</p>
    <p style="direction: ltr;">FROM INVOICES,INVOICESA,INVOICEITEMSA,USERS,PORDERS,PORDERSA,IVORD?,PORDTYPES</p>
    <p style="direction: ltr;">WHERE INVOICES.IV=INVOICESA.IV</p>
    <p style="direction: ltr;">AND INVOICEITEMSA.IV=INVOICESA.IV</p>
    <p style="direction: ltr;">AND INVOICES.IV=IVORD.IV</p>
    <p style="direction: ltr;">AND PORDERS.ORD=IVORD.ORD</p>
    <p style="direction: ltr;">AND IVORD.ORD=PORDERSA.ORD</p>
    <p style="direction: ltr;">AND PORDTYPES.PORDTYPE=PORDERSA.PORDTYPE</p>
    <p style="direction: ltr;">AND INVOICESA.TYPEDDATE = SQL.DATE8-48:00</p>
    <p style="direction: ltr;">AND IVORD.IV=INVOICES.IV</p>
    <p style="direction: ltr;">AND IVNUM LIKE 'VI%'</p>
    <p style="direction: ltr;">AND INVOICES.USER=USERS.USER</p>
    <p style="direction: ltr;">ORDER BY INVOICES.IV</p>
    <p style="direction: ltr;">FORMAT;</p>
    ולהלן הSQL, כשהחלק המעצבן מודגש:
    <p dir="ltr">======
    select demo.dbo.INVOICES.IVNUM ,
    demo.dbo.PORDERS.ORDNAME ,
    (0.0 + ( convert(decimal(19,2), demo.dbo.INVOICEITEMSA.TOTPRICE) )) ,
    system.dbo.USERS.USERLOGIN ,
    demo.dbo.INVOICESA.TYPEDDATE ,
    demo.dbo.INVOICEITEMSA.KLINE ,
    demo.dbo.PORDTYPES.TYPEDES ,
    demo.dbo.INVOICES.IV
    from demo.dbo.INVOICES
    inner join demo.dbo.INVOICESA on ( demo.dbo.INVOICESA.IV = demo.dbo.INVOICES.IV )
    inner join demo.dbo.INVOICEITEMSA on ( demo.dbo.INVOICEITEMSA.IV = demo.dbo.INVOICESA.IV )
    inner join demo.dbo.PORDERSA on 1 = 1
    inner join demo.dbo.PORDERS on 1 = 1
    inner join demo.dbo.PORDTYPES on ( demo.dbo.PORDTYPES.PORDTYPE = demo.dbo.PORDERSA.PORDTYPE )
    inner join system.dbo.USERS on ( system.dbo.USERS.T$USER = demo.dbo.INVOICES.T$USER )
    left outer join demo.dbo.IVORD on ( demo.dbo.IVORD.IV = demo.dbo.INVOICES.IV ) and ( demo.dbo.IVORD.ORD = demo.dbo.PORDERSA.ORD )
    where ( coalesce( demo.dbo.IVORD.IV , 0 ) = demo.dbo.INVOICES.IV ) and ( coalesce( demo.dbo.IVORD.ORD , 0 ) = demo.dbo.PORDERS.ORD ) and ( demo.dbo.INVOICESA.TYPEDDATE = ( ? – ? ) ) and demo.dbo.INVOICES.IVNUM like ltrim(rtrim( ? ))
    order by 8</p>

מוצגות 4 תגובות – 1 עד 4 (מתוך 4 סה״כ)
  • Replies
    yitzchok
    משתתף
    IL
    קצת קשה לקרוא את השאילתא בזמן המוגבל שיש לי אבל אני רואה ש-IVORD מסומן כחיתוך מותנה ובאותו זמן PORDERS (שקשור הלאה ל-PORDTYPES) נכנס רק לפי IVORD ולכן יתכן בעיות.

    למה אתה מסתבך עם INVOICES.ORD וגם IVORD? (אכן זה עושה את השאילתא יותר מורכב ומאתגר ואני לא בטוח שניתן לעשות את זה נכון בשאילתא אחת בסינטקס של פריוריטי. אולי שווה לכתוב ישירות בסינטקס של MSSQL וזהו)

    הגדרות אלה אמורות להביא לך שורות ל-INVOICEITEMS עם ערך של ORDI, לא משנה מאיזה מהם הגיעה. מה-ORDI אפשר לחזור ל-ORD

    ועוד יכול להיות שאין לך שורות בחשבונית להזמנות אלה (אלא שורות שלא קשורות להזמנה) או לא כל השורות של ההזמנה – אבל אולי כך אתה רוצה.

     

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    cshames
    משתתף

    למה אתה מסתבך עם INVOICES.ORD וגם IVORD?

    IVORD מקשר בין הזמנות הרכש לחשבוניות כאשר מקושרת הזמנות רבות לחשבונית אחת, אך כאשר מקושרת הזמנה יחידה לחשבונית אחת, ההזמנה לא נמצאת בIVORD אלא בINVOICES.ORD. תקן אותי אם אני טועה.

    אולי שווה לכתוב ישירות בסינטקס של MSSQL וזהו

    אם זה אפשרי זה יהיה מושלם, בינתיים הנסיונות שלי להצהיר על JOIN ישירות בWINDBI נגמרו בSYNTAX ERROR. אם יש דרך לכתוב בSQL (שיהיה אחר כך אפשרי להריץ את זה כSTEP בפרוצדורה) אשמח לדעת איך עושים זאת.

    הגדרות אלה אמורות להביא לך שורות ל-INVOICEITEMS עם ערך של ORDI, לא משנה מאיזה מהם הגיעה. מה-ORDI אפשר לחזור ל-ORD

    נראה שהORDI יוצא 0 כשיש כמה הזמנות מקושרות לאותה החשבונית, אז אם אני חותך איתו ההזמנות האלה בעצם לא נמשכות ואני לא יכול לראות את סוג ההזמנה, שזו מטרת הדוח. אגב לא ציינתי זאת מלכתחילה אבל מטרת הדוח היא בעצם לסכום את כל חשבוניות הספק לפי סוג הזמנה ומחלקה כך שבסופו של דבר יראו פשוט מחלקה>>סוג הזמנה>>סכום

     

    yitzchok
    משתתף
    IL
    שאלתי למה אתה מסתבך וזה היה כהקדמה למה שכתבתי לאחר מכן לגבי ORDI

    בדקתי אצלי ואני רואה שאם אני בוחר הזמנות רכש בחשבונית ספק או שורות הזמנות בחשבונית רכש שהשורות שנוצרו בפירוט החשבונית מציגות את ההזמנה והשורה וזה על פניו על בסיס חיתוך מ-ORDI ל-PORDERITEMS ואז ל-PORDERS

    אני לא יכול להגיד למה אין לך ערכים ב-ORDI. עשית בדיקה מקיפה? אולי עלית על חשבונית חריגה? לפעמים משתמש מוחק שורות ואז מקליד מחדש והשורות החדשות לא בהכרח יהיו קשורות לשורות הזמנה כמו קודם.

    הייתי אומר שחשוב להגיע להזמנות רכש ברמת השורה. הרי אתה מסכם סכומים מהשורות (שים לב שאתה לוקח ערך שלפני הנחה כללית ועיגול וכו'). ואם החשבונית תהיה מורכבת מהזמנות של מחלקות שונות תרצה לשייך את השורות הנכונות למחלקות הנכונות.

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

    תודה רבה יצחק, אני מעריך את הזמן שהשקעת לעזור לי.

מוצגות 4 תגובות – 1 עד 4 (מתוך 4 סה״כ)

תגיות: , ,

  • יש להתחבר למערכת על מנת להגיב.