› פורומים › אפיון ופיתוח פריוריטי › הגדרת JOIN בSYNTAX המקומי
- This topic has 4 תגובות, 2 משתתפים, and was last updated לפני 4 שנים, 3 חודשים by cshames.
- Post
-
- אוגוסט 9, 2020 בשעה 8:36 am
שבוע טוב לכולם,אני מנסה לכתוב שאילתא שתהפוך בסופו של דבר לדוח שימשוך כמה פרטים מתוך כל הזמנות הרכש המקושרות לחשבוניות ספק, כאשר רשימת חשבוניות הספק מאולצת ע"י תנאי מסויים (בדוגמא למטה תאריך הקלדה). הבעיה היא שאני נאלץ למשוך את 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>
- Replies
-
- אוגוסט 9, 2020 בשעה 1:22 pm
קצת קשה לקרוא את השאילתא בזמן המוגבל שיש לי אבל אני רואה ש-IVORD מסומן כחיתוך מותנה ובאותו זמן PORDERS (שקשור הלאה ל-PORDTYPES) נכנס רק לפי IVORD ולכן יתכן בעיות.למה אתה מסתבך עם INVOICES.ORD וגם IVORD? (אכן זה עושה את השאילתא יותר מורכב ומאתגר ואני לא בטוח שניתן לעשות את זה נכון בשאילתא אחת בסינטקס של פריוריטי. אולי שווה לכתוב ישירות בסינטקס של MSSQL וזהו)
הגדרות אלה אמורות להביא לך שורות ל-INVOICEITEMS עם ערך של ORDI, לא משנה מאיזה מהם הגיעה. מה-ORDI אפשר לחזור ל-ORD
ועוד יכול להיות שאין לך שורות בחשבונית להזמנות אלה (אלא שורות שלא קשורות להזמנה) או לא כל השורות של ההזמנה – אבל אולי כך אתה רוצה.
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]- אוגוסט 9, 2020 בשעה 4:47 pm
למה אתה מסתבך עם INVOICES.ORD וגם IVORD?
IVORD מקשר בין הזמנות הרכש לחשבוניות כאשר מקושרת הזמנות רבות לחשבונית אחת, אך כאשר מקושרת הזמנה יחידה לחשבונית אחת, ההזמנה לא נמצאת בIVORD אלא בINVOICES.ORD. תקן אותי אם אני טועה.
אולי שווה לכתוב ישירות בסינטקס של MSSQL וזהו
אם זה אפשרי זה יהיה מושלם, בינתיים הנסיונות שלי להצהיר על JOIN ישירות בWINDBI נגמרו בSYNTAX ERROR. אם יש דרך לכתוב בSQL (שיהיה אחר כך אפשרי להריץ את זה כSTEP בפרוצדורה) אשמח לדעת איך עושים זאת.
הגדרות אלה אמורות להביא לך שורות ל-INVOICEITEMS עם ערך של ORDI, לא משנה מאיזה מהם הגיעה. מה-ORDI אפשר לחזור ל-ORD
נראה שהORDI יוצא 0 כשיש כמה הזמנות מקושרות לאותה החשבונית, אז אם אני חותך איתו ההזמנות האלה בעצם לא נמשכות ואני לא יכול לראות את סוג ההזמנה, שזו מטרת הדוח. אגב לא ציינתי זאת מלכתחילה אבל מטרת הדוח היא בעצם לסכום את כל חשבוניות הספק לפי סוג הזמנה ומחלקה כך שבסופו של דבר יראו פשוט מחלקה>>סוג הזמנה>>סכום
- אוגוסט 9, 2020 בשעה 7:58 pm
שאלתי למה אתה מסתבך וזה היה כהקדמה למה שכתבתי לאחר מכן לגבי ORDIבדקתי אצלי ואני רואה שאם אני בוחר הזמנות רכש בחשבונית ספק או שורות הזמנות בחשבונית רכש שהשורות שנוצרו בפירוט החשבונית מציגות את ההזמנה והשורה וזה על פניו על בסיס חיתוך מ-ORDI ל-PORDERITEMS ואז ל-PORDERS
אני לא יכול להגיד למה אין לך ערכים ב-ORDI. עשית בדיקה מקיפה? אולי עלית על חשבונית חריגה? לפעמים משתמש מוחק שורות ואז מקליד מחדש והשורות החדשות לא בהכרח יהיו קשורות לשורות הזמנה כמו קודם.
הייתי אומר שחשוב להגיע להזמנות רכש ברמת השורה. הרי אתה מסכם סכומים מהשורות (שים לב שאתה לוקח ערך שלפני הנחה כללית ועיגול וכו'). ואם החשבונית תהיה מורכבת מהזמנות של מחלקות שונות תרצה לשייך את השורות הנכונות למחלקות הנכונות.
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]- אוגוסט 10, 2020 בשעה 4:43 pm
באמת שהקונץ היה להשתמש בORDI, טעיתי לגבי מה שאמרתי מקודם על ריבוי הזמנות. עשיתי עוד כמה טסטים והבנתי איך להשתמש בו כמו שצריך. פתרתי גם עוד קצת סלט שהיה לי עם מפתחות בהיררכיות שונות והשאילתה התחילה לשלוף את הנתונים כמה שצריך.תודה רבה יצחק, אני מעריך את הזמן שהשקעת לעזור לי.
תגיות: INTERPRETER, JOIN, SYNTAX
- יש להתחבר למערכת על מנת להגיב.