ערב טוב...

משקיען10

New member
ערב טוב...

זמן רב לא התחברתי לפורום לצערי...
האם יש משהו שמכיר את תוכנת sap business one ואת הטבלאות שלה?
יש לי שאילתה שאני כבר ימים משחק איתה ולא מצליח לקבל בדיוק את מה שאני מחפש. בינתיין עובד על שתי שאילתות מקבילות שכל אחת מהן בנפרד מביאה לי את מה שאני צריך אבל אני רוצה לקבל את זה בשאילתה אחת עבור משתמשי הארגון שלי.
ב- DB יש טבלאות מסדים כותרת ושורות, טבלאות של מסמכים שונים כגון העברה בין מחסנים, כניסה למלאי וכו' ופעילויות לכרטיסים.
השאילתה שלי מביאה את מספר המסד ואת מספר והתאריך האחרון ששהוא נכנס למחסן מסוים , מס' כרטיס וכו' באמצעות שאילתה ואותו מסד גם יוצא לפעילות / השאלות בכרטיסי לקוחות. מה שאני רוצה להשיג זה לקבל בשורה אחת את מספר המסמך האחרון של הכניסה למלאי במחסן מסוים ואת פרטי הכרטיס לקוח שקיבל את אותו מס"ד (אנשי קשר בארגון שלנו) וכן את מספר הפעילות האחרונה ואת פרטי הלקוח שאצלו נמצא המסד באותו רגע. הצלחתי לקבל תוצאה שאני מקבל את רק את המסדים שנמצאיןם באותו מחסן / כרטיס וגם יש להם פעילות ואת פרטי הלקוח אבל יש המון מסדים שנמצאים תחת המחסן של העובדים ולא מושאלים באותו רגע ואותם אני לא מקבל בתוצאה של השאילתה.
מדובר על צירוף של 8 טבלאות שונות. לצערי לא ניתן להשתמש ב- partitions כי הצלחתי לבצע את זה דרך ה- DB עצמו אבל השאילתה חייבת להיות מופעלת דרך האפליקציה כדי שלמשתמשים תהיה גישה אליה ולצערי ה- SBO לא תומך בכך אז אני תקוע בינתיים.
מחר אני אעלה מהעבודה את השאילתה עצמה ומקווה שמישהו יוכל לעזור מה לא עשיתי נכון.
 

משקיען10

New member
הי איתי - תודה מראש...

SELECT T2.[ItemCode], T1.[IntrSerial], T1.[WhsCode] ,
max(T0.[DocDate]) as N'last transfer',
datediff(dy,max(T0.[DocDate]),getdate ()) AS
N'מספר ימים במחסן - רק מעל 30',
&nbsp
MAX(T3.[ClgCode]), T4.[CardName] ,
&nbsp
T5.[U_NAME]
&nbsp
FROM SRI1 T0
&nbsp
INNER JOIN OSRI T1 ON T0.SysSerial = T1.SysSerial
&nbsp
inner join osrn t2 on t1.IntrSerial=t2.DistNumber
&nbsp
inner join oclg t3 on T1.[IntrSerial] = T3.[U_XIS_Serial]
&nbsp
INNER JOIN OCRD T4 ON T3.CardCode = T4.CardCode
&nbsp
INNER JOIN OUSR T5 ON T3.AttendUser = T5.USERID
&nbsp
WHERE T2.[ItemCode] ='340001' AND (T0.[ItemCode]= T1.[ItemCode])
&nbsp
AND T0.[Direction] <>'1' AND T1.[WhsCode] = '6'
GROUP BY T2.[ItemCode],T1.[IntrSerial], T1.[Direction], T1.[BaseNum], T1.[BaseType] ,T1.[WhsCode] , T4.[CardName], T5.[U_NAME]
&nbsp
HAVING datediff(dy,max(T0.[DocDate]),getdate ()) >'30'
&nbsp
ORDER BY 5 desc
אני יודע שזה קצת קשה לאתר שגיאה בלי DML+DDL אז אולי משהו יקפוץ לכם בעין שעשיתי שגוי אם לא אני אעלה מחר שוב גם את זה
בקצרה מה שאני רוצה זה שורה אחת לכל מסד שתכלולל את תאריך ההעברה אחרון למחסן 6 ואת תאריך הפעילות האחרון שלו ומה שאני מקבל זה את תאריך האחרון של העברה למחסן אבל תמיד מקבל גם את כל השורות של הפעילויות שהמסד היה מושאל ללקוחות.
האם הפתרון הוא ביצירת VIEW או temp table או שאפשר לתקן בשאילתה הזו ?
 

pitoach

New member
זה לא עניין של קשה


זה עניין של בזבוז זמן שלנו, בזמן שאת ההשקעה של הזמן אתה אמור לעשות עד כמה שאפשר


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

משקיען10

New member
מצאתי פתרון מצויין - אבל חסר לי עדיין משהו...

בניתי את השאילתה בצורה שונה וזה עובד מצויין אבל אני רוצה לשלב נתונים מעוד מס' טבלאות ב- inner join ולא מצאתי את הדרך לזה באינטרנט וחיפשתי הרבה...משהו יכול אולי להדגים לי כיצד להוסיף עוד עמודה מטבלה נוספת לדוגמא customer_name מטבלת costomers where oclg.cardcode=customers,cardcode?
אחרי זה אני כבר אעשה את שאר ה- JOINS כי אני צריך לשלב נתונים מעוד מספר טבלאות אז צריך רק את ההתחלה אם זה בכלל ניתן.

SELECT * from (T.[CardCode], T.[ClgCode], T.[U_XIS_Serial], T.[CntctDate],
ROW_NUMBER() over (partition by t.[U_XIS_Serial]
order by CntctDate desc) rnk
from OCLG T
) e
where e.rnk = 1
 
למעלה