משיב מוביל
בעיה

שאלה
-
שלום,
במהלך בנייה של פרויקט כלשהו ללימודים בבעיה.
רקע רלוונטי:
מסד הנתונים שנבנה ב-sql server ומיועד לעסק מסוים מכיל 12 טבלאות, בין היתר ישנה טבלה לספקים , לחומרים וטבלת קשר בין הספקים לחומרים שנקראת גם טבלת 'הזמנות'.
המפתח הראשי של טבלת הקשר 'הזמנות' מורכב ממספר ספק + מספר חומר + תאריך הזמנה (למקרה שתהיה הזמנה חוזרת של אותו חומר מאותו ספק). אני מעוניין לאפשר למשתמש ( באמצעות תוכנה שנבנית ב-c#) להכניס באותה הזמנה (בעלת אותו ספק ואותו תאריך) יותר מחומר אחד על מנת שאוכל לחשב סכום תשלום כולל להזמנה שיופיע באותה רשומה. כמות החומרים להזמנה לא יכולה להיות מוגבלת והמשתמש יוכל לצרף לאותה הזמנה כמה חומרים שירצה ( לדוגמא כל פעם יישאל האם הוא רוצה להוסיף עוד חומר להזמנה).
זה די דומה לקניות בסופר, כל קנייה מורכבת ממספר של מוצרים שמשתנה בין קנייה לקנייה אך עדיין משויך לאותה הזמנה.
כרגע, באופן שמסד הנתונים בנוי זה בלתי אפשרי ליישם את מה שאני רוצה ופיתרון ברמת התוכנה יהיה מסורבל.
האם ניתן לפתור את הבעיה ברמת מסד הנתונים או רק ברמת התוכנה עצמה?
תשובות
-
כמה נקודות:
* מה שאתה מציג זו אפליקציה פשוטה ביותר של חנות וירטואלית. כל מדריך בסיסי של פיתוח כולל המדריך למתחילים שמופיע באתר מייקרוסופט http://www.asp.net מכיל למעשה אפליקציה של חנות וירטואלית. תמיד לומדים קודם כל להרץ קוד "Hello world" זה עניין היסטורי דיי קבוע... ובכל פיתוח WEB האפליקציה הראשונה שמפתחים היא חנות וירטואלית פשוטה והדבר נכון גם למדריכים ישנים מאוד של ASP קלאסי למשל. אני מציע לך לעבור על אחד המדריכים לעומק כי לפי מה שנראה התכנון שלך למערכת אינו טוב מהיסוד והטוב ביותר הוא לגשת לשלב התכנון מההתחלה ולזרוק את הקיים.
אתה יכול למשל לעבור על המדריך הראשון שיש באתר מייקרוסופט: Your First ASP.NET MVC App (זוהי חנות תקליטים). אם אתה עובד עם טכנולוגיה אחרת אז יש גרסה למדריך גם בטכנולוגיית Web Form.
* אתה טועה לחלוטין בגישה של "אי אפשר" ! התשובה היא כמובן שאפשר :-)
כל מה שאפשר לפתח באפליקציה חיצונית אפשר לפתח בשרת SQL מבחינת ניהול הנתונים, וחלק מהדברים בצורה הרבה יותר טובה ומיטבית מאשר דרך אפליקציה חיצונית. אל תשכח ששרת SQL החל כבר מגרסה 2005 יודע להריץ כל DLL וכל קוד שמפותח בדוט-נט. CLR הוא חלק משרתי SQL לכן. כמובן שהמטרה שלך בסוף להבנתי היא לחבר את מסד הנתונים לאפליקציה חיצונית ולכן עלייך לתכנן מה נעשה היכן. בדרך כלל עבודה על נתונים נעשית במסד הנתונים בעוד טפסים ותצוגות למשתמש ועיבוד של נתונים מהמשתמש נעשים באפליקציה החיצונית. הרעיון הוא שאל מסד הנתונים מנסים להעביר את הנתונים מהאפליקציה כמה שיותר מתאימים כבר למסד הנתונים בעוד נתונים שצריכים להגיע ממסד הנתונים אל האפליקציה ננסה לארגן כבר במסד הנתונים כך שנעביר אותם לאפליקציה בצורה המתאימה לאפליקציה (היעד קובע את המקום בו בדרך כלל עדיף לבצע את העיבוד).
אני מציע לך לעבוד מול גוגל או הדוגמה שהבאתי ולתכנן את מבנה הנתונים שלך תחילה כך שיתאים למה שאתה צריך. אפיון ותכנון הוא הצעד הראשון בפיתוח ולא מתחילים בפיתוח לפני האפשריון אמתים לאפליקציה. לא בונים את הטבלאות ורק אז חושבים לאיזה אפליקציה הן יתאימו
* כדי שנוכל לעזור לך יותר תמיד כשאתה שם שאלה בפורום הקשורה במבנה טבלאות שלך צרף לשאלה שאילתה של יצירת כל הטבלאות שלך כדי שנוכל להבין בדיוק מה המצב הנוכחי ולהציע פתרון מתאים.
כמו כן הכן שאילתה פשוטה של הכנסת כמה נתונים לדוגמה
ולסיום צרף לנו בדיוק הסבר של מה שאתה רוצה לקבל בתוצאה על סמך הטבלאות שהעברת שלנו (לא במילים אלא בשאילתה) והנתונים לדוגמה
- נערך על-ידי pituachMVP, Moderator יום ראשון 25 ספטמבר 2011 20:53
- סומן כתשובה על-ידי Guy GlantserMVP, Moderator יום חמישי 21 אוגוסט 2014 06:03
-
use QQ
go
-- חסר סגירת סוגריים בשאילתות יצירת הטבלאות
CREATE TABLE [dbo].[tblSupplierA](
[ID] [smallint] NOT NULL,
[Company_Name] [varchar](25) NULL,
[Contact_Name] [varchar](25) NULL,
[Email] [varchar](25) NULL,
[Land_Line_Number] [varchar](15) NULL,
[Mobile] [varchar](20) NULL,
[Address] [varchar](25) NULL)
CREATE TABLE [dbo].[tblSupplierA_Materials](
[SupplierA_ID] [smallint] NOT NULL,
[Materials_ID] [smallint] NOT NULL,
[Invoice_Number] [int] NULL,
[Dates] [varchar](20) NOT NULL,
[Quantity] [smallint] NULL,
[Price_Per_Pnit] [real] NULL,
[total_price] [real] NULL,
[Currency] [varchar](10) NULL,
[Nis] [float] NULL,
[File_Contant] [varbinary](max) NULL,
[File_N] [varchar](60) NULL,
[File_Extension] [char](4) NULL)
-- חבל שלא צירפת סקריפט של הכנסת כמה נתונים לטבלאות כדוגמה כדי שנוכל לבסס התחלה זהה
/*************************** טענה של שואל השאלה
הדבר ההגיוני והנכון (לדעתי) הוא שכל החומרים שהוזמנו בהזמנה אחת בפועל ישוייכו לאותה הזמנה בתאריך 25/09/11 גם במסד הנתונים דהיינו לאותה רשומה בטבלת tblSupplierA_Materials קרי טבלת ההזמנות. מכיוון שהמפתח של טבלה זו הוא הרכב של 3 שדות שצוינו לעיל, לא ניתן לשייך יותר מחומר אחד( ראה material) להזמנה מספק בתאריך מסוים.
איני מעוניין שכל הזמנה תתחלק למספר רשומות כמספר החומרים שהוזמנו כי זה מסרבל את הממשק בכמה מישורים ( למשל בכדי להציג סכום כולל ששולם עבור הזמנה אצטרך לעשות שאילתה שתחזיר לי את כל ההזמנות עם שני פרמטרים - תאריך ההזמנה ומס' הספק והשימוש ב-data grid view יהיה לא פשוט) אלא שכל הזמנה מספק בתאריך כלשהו תוכל להכיל מספר חומרים אשר הוא אינו קבוע ומגביל.
*/
/*************************** תגובה
אתה טועה לחלוטין בגישה שפיצול יוצר סירבול בעוד פיצול יוצר גמישות
חיבור נתונים נעשה ברמת מסד הנתונים בצורה פשוטה כמו בעזרת
JOIN
אתה מציג כאן יחס הכי פשוט של יחיד לרבים: כל הזמנה כוללת מספר פריטים
מדובר בשאלה מהספרים ממש שהאפיון הנכון הוא דיי חד משמעי: יחס יחיד לרבים ממשים עם טבלה נוספת מקושרת בעזרת מפתח לטבלה הראשית
למעשה דווקא כמפתח דוטנט אני מתפלא שזה האפיון שלך כי כל הרעיון העומד מאחורי מודול האובייקטים אינו בה לידי ביטוי אצלך
מודל האובייקטים שם כדגש כפי ששמו מציג את הרעיון של פיצול לאובייקטים ושימוש בירושה
האפיון הבסיסי הברור כאן צריך להיות שיש לך מחלקה של פריט/חומר
Material
יש לך אוסף של חומרים בעסק. ... למשל:
IEnumerable<Material>
הזמנה כוללת אוסף של פריטים המוכנסים להזמנה - יחס יחיד לרבים בין הזמנה לפירוט ההמנה
כשצירפת את האקסל נתת לי כיוון טוב להעריך שמקור הבעיה הוא במעבר מאקסל וגישה של פיתוח ישיר לשימוש במסדי נתונים טבלאיים ופיתוח במודול האובייקטים
האקסל מציג סיכום של ההמנה אבל בפיתוח נכון אנחנו מנסים להציג את מאחורי הקלעים של הטופס
האקסל מציג נתונים בצורה מעורבבת ללא קשר זה לזה מבחינת שורה ועמודה בעוד במבנה טבלאי אנחנו בונים את הנתונים בצורת רשומות של אובייקט מסויים
לכן כדי לעבוד עם עירבוב של נתונים עושיםש שמוש בכמה טבלאות
כאמור התכנון שלך מהיסוד פשוט אינו נכון והייתי מציע לך בשלב זה כשהדברים ברורים להעסיק יועץ חיצוני לאפיון האפיקציה אם אינך מצליח להעזר במדריכים השונים באינטרנט של חנויות וירטואליות כדי לתרגם את המבנה של חנות וירטואלית למצב שלכם
*/
/*************************** טענה של שואל השאלה */
INSERT INTO tblSupplierA_Materials
(SupplierA_ID, Materials_ID, Invoice_Number,Dates,Quantity,Price_Per_Unit,total_Price
,Currency,Nis,File_Content,File_N,File_Extension)
VALUES (1, 1, 1234, 25/09/2011, 20, 15, 300,Us,1200,varbinaryD,invoice,pdf)
/*************************** תגובה
השאילתה בכלל אינה מתאימה לטבלה שלך השדות אינם מתאימים לשאילתה של יצירת הטבלה
בדוק את הנושא והעבר לנו שאילתות תואמות
*/
/*************************** טענה של שואל השאלה
בתצורה הנוכחית איני יכול לבצע את שרציתי -שיוך כמה חומרים לרשומת הזמנה אחת מספק אחד בתאריך אחד.
*/
/*************************** תגובה
סליחה על המילה אבל זו פשוט שטות
אתה ננעל על זה שאי אפשר במקום לבצע את מה שמוצע לך כדי שכן יהיה אפשר
אם אתה מגלה שאפיון של אפליקציה לא מתאים אז תשנה את האפיון
הזמן שאתה משקיע על לחשוב כיצד להתאים את המציאות לאפיון המוטעה הוא הרבה יותר מהזמן של אפיון נכון לפי המציאות
המציאות והצרכים והיעדים קובעים את האפיון ולא האפיון קובגע את המציאות
*/
/*
לסיום: אם אתה נעול על כך שאתה רוצה לעבוד בצורה שבה כל הנתונים שמורים כמו באקסל בטבלה אחת אז גם את זה אפשר
למעשה אם אתה רוצה אפשר גם לעבוד עם שרתי מסדי נתונים מקצועיים כאילו הם כתבן פשוט
זה כמובן דרך גרועה מאוד שאינה מתאימה אבל כמו שאומרים... אם הלקוח רוצה אז תמיד אפשר למצוא פתרון
אחת השיטות לבצע זאת היא שימוש בהכנסת הנתונים לאותו שדה בטבלה תוך שימוש בפורמט המאפשר לאפליקציה לנתח את הנתונים ולהפריד אותם
למשל אתה יכול בשדה אחד בטבלה של ההזמנות להכניס את כל החומרים שהוזמנו על ידי שימוש בהפרדת פסיק כדי להפריד בין חומרים ובהפרדת @ כדי להפריד את מספר המוצרים
לדוגמה:
הוזמנו שני מוצרים מסוג X
ושלושה מוצרים מסוג Y
אז בשדה המוצרים של ההמזנה מכניסים
2@X,3@Y
שוב אני מציין שזו דרך גרועה מאוד אבל אם אתה נעול על הכנסת כל הנתונים לבטלה אחת אז זו אחת הדרכים
*/
- נערך על-ידי pituachMVP, Moderator יום שני 26 ספטמבר 2011 04:50
- הוצע כתשובה על-ידי pituachMVP, Moderator יום חמישי 06 יוני 2013 09:40
- סומן כתשובה על-ידי Guy GlantserMVP, Moderator יום חמישי 21 אוגוסט 2014 06:04
כל התגובות
-
כמה נקודות:
* מה שאתה מציג זו אפליקציה פשוטה ביותר של חנות וירטואלית. כל מדריך בסיסי של פיתוח כולל המדריך למתחילים שמופיע באתר מייקרוסופט http://www.asp.net מכיל למעשה אפליקציה של חנות וירטואלית. תמיד לומדים קודם כל להרץ קוד "Hello world" זה עניין היסטורי דיי קבוע... ובכל פיתוח WEB האפליקציה הראשונה שמפתחים היא חנות וירטואלית פשוטה והדבר נכון גם למדריכים ישנים מאוד של ASP קלאסי למשל. אני מציע לך לעבור על אחד המדריכים לעומק כי לפי מה שנראה התכנון שלך למערכת אינו טוב מהיסוד והטוב ביותר הוא לגשת לשלב התכנון מההתחלה ולזרוק את הקיים.
אתה יכול למשל לעבור על המדריך הראשון שיש באתר מייקרוסופט: Your First ASP.NET MVC App (זוהי חנות תקליטים). אם אתה עובד עם טכנולוגיה אחרת אז יש גרסה למדריך גם בטכנולוגיית Web Form.
* אתה טועה לחלוטין בגישה של "אי אפשר" ! התשובה היא כמובן שאפשר :-)
כל מה שאפשר לפתח באפליקציה חיצונית אפשר לפתח בשרת SQL מבחינת ניהול הנתונים, וחלק מהדברים בצורה הרבה יותר טובה ומיטבית מאשר דרך אפליקציה חיצונית. אל תשכח ששרת SQL החל כבר מגרסה 2005 יודע להריץ כל DLL וכל קוד שמפותח בדוט-נט. CLR הוא חלק משרתי SQL לכן. כמובן שהמטרה שלך בסוף להבנתי היא לחבר את מסד הנתונים לאפליקציה חיצונית ולכן עלייך לתכנן מה נעשה היכן. בדרך כלל עבודה על נתונים נעשית במסד הנתונים בעוד טפסים ותצוגות למשתמש ועיבוד של נתונים מהמשתמש נעשים באפליקציה החיצונית. הרעיון הוא שאל מסד הנתונים מנסים להעביר את הנתונים מהאפליקציה כמה שיותר מתאימים כבר למסד הנתונים בעוד נתונים שצריכים להגיע ממסד הנתונים אל האפליקציה ננסה לארגן כבר במסד הנתונים כך שנעביר אותם לאפליקציה בצורה המתאימה לאפליקציה (היעד קובע את המקום בו בדרך כלל עדיף לבצע את העיבוד).
אני מציע לך לעבוד מול גוגל או הדוגמה שהבאתי ולתכנן את מבנה הנתונים שלך תחילה כך שיתאים למה שאתה צריך. אפיון ותכנון הוא הצעד הראשון בפיתוח ולא מתחילים בפיתוח לפני האפשריון אמתים לאפליקציה. לא בונים את הטבלאות ורק אז חושבים לאיזה אפליקציה הן יתאימו
* כדי שנוכל לעזור לך יותר תמיד כשאתה שם שאלה בפורום הקשורה במבנה טבלאות שלך צרף לשאלה שאילתה של יצירת כל הטבלאות שלך כדי שנוכל להבין בדיוק מה המצב הנוכחי ולהציע פתרון מתאים.
כמו כן הכן שאילתה פשוטה של הכנסת כמה נתונים לדוגמה
ולסיום צרף לנו בדיוק הסבר של מה שאתה רוצה לקבל בתוצאה על סמך הטבלאות שהעברת שלנו (לא במילים אלא בשאילתה) והנתונים לדוגמה
- נערך על-ידי pituachMVP, Moderator יום ראשון 25 ספטמבר 2011 20:53
- סומן כתשובה על-ידי Guy GlantserMVP, Moderator יום חמישי 21 אוגוסט 2014 06:03
-
ראשית תודה על התגובה המקיפה אך כנראה שאני צריך לעבות את השאלה עם עוד פרטים.
האפליקציה שלי היא אינה אפליקציית web אלא windows form application ואני כותב אותה בסביבת .net
בשפת c#. מסד הנתונים תוכנן לפני מימוש התוכנה והוא מומש בsql server .
כיאה לפרויקט ראשון אני נאלץ לבצע התאמות במסד הנתונים כגון הוספת שדות ולפעמים הוספת שדות למפתחות ראשיים
בכדי לעמוד בדרישות הלקוח ואילוצים אחרים.
אני מצרף פה סקריפט של הטבלאות הרלוונטיות שציינתי בפוסט הקודם -
1. טבלת 'חומרים' - tblMaterial שהמפתח הראשי שלה הוא id
CREATE TABLE [dbo].[tblMaterials](
[ID] [smallint] NOT NULL,
[Name] [varchar](25) NULL,
[Descriptions] [varchar](50) NULL,2. טבלת 'ספקים' - tblSupplierA שהמפתח הראשי שלה הוא id
CREATE TABLE [dbo].[tblSupplierA](
[ID] [smallint] NOT NULL,
[Company_Name] [varchar](25) NULL,
[Contact_Name] [varchar](25) NULL,
[Email] [varchar](25) NULL,
[Land_Line_Number] [varchar](15) NULL,
[Mobile] [varchar](20) NULL,
[Address] [varchar](25) NULL3. טבלת הקשר בין 1 ל-2 - tblSupplierA_Materials שהמפתח הראשי שלה הוא id מטבלת חומרים +id מטבלת ספקים + תאריך הזמנה
CREATE TABLE [dbo].[tblSupplierA_Materials](
[SupplierA_ID] [smallint] NOT NULL,
[Materials_ID] [smallint] NOT NULL,
[Invoice_Number] [int] NULL,
[Dates] [varchar](20) NOT NULL,
[Quantity] [smallint] NULL,
[Price_Per_Pnit] [real] NULL,
[total_price] [real] NULL,
[Currency] [varchar](10) NULL,
[Nis] [float] NULL,
[File_Contant] [varbinary](max) NULL,
[File_N] [varchar](60) NULL,
[File_Extension] [char](4) NULL,בתוכנה שאני בונה ישנו ממשק הוספה/הסרה/עדכון לכל טבלה וכמובן שקיים טופס כזה לטבלת הקשר tblSupplierA_Materials.
רק שיהיה ברור - המטרה העיקרית של התוכנה היא תיעוד הפעולות שמתבצעות בעסק לרבות הזמנה של חומרי גלם מספקים (שאת הזמנה זו מייצגת טבלת הקשר).
בתוכנה אני מציג את הרשומות מהטבלאות בשני אופנים:
dataGridView .1 מעין אפשרות יעילה של הצגת נתונים (בדר"כ טבלאיים) ממקור נתונים קרי מסד הנתונים שלי.
2. תיבות טקסט כשליד כל תיבה יש את שם השדה המתאים.
נניח שהעסק בפועל ביצע הזמנה של 3 סוגי חומרים בכמויות שונות לכל סוג חומר מספק אחד בתאריך 25/09/11 ומעוניין לתעד הזמנה זו בתוכנה.
הדבר ההגיוני והנכון (לדעתי) הוא שכל החומרים שהוזמנו בהזמנה אחת בפועל ישוייכו לאותה הזמנה בתאריך 25/09/11 גם במסד הנתונים דהיינו לאותה רשומה בטבלת tblSupplierA_Materials קרי טבלת ההזמנות. מכיוון שהמפתח של טבלה זו הוא הרכב של 3 שדות שצוינו לעיל, לא ניתן לשייך יותר מחומר אחד( ראה material) להזמנה מספק בתאריך מסוים.
איני מעוניין שכל הזמנה תתחלק למספר רשומות כמספר החומרים שהוזמנו כי זה מסרבל את הממשק בכמה מישורים ( למשל בכדי להציג סכום כולל ששולם עבור הזמנה אצטרך לעשות שאילתה שתחזיר לי את כל ההזמנות עם שני פרמטרים - תאריך ההזמנה ומס' הספק והשימוש ב-data grid view יהיה לא פשוט) אלא שכל הזמנה מספק בתאריך כלשהו תוכל להכיל מספר חומרים אשר הוא אינו קבוע ומגביל.
להלן שאילתת הוספה פשוטה לטבלת הקשר:
INSERT INTO tblSupplierA_Materials (SupplierA_ID, Materials_ID, Invoice_Number,Dates,Quantity,Price_Per_Unit,total_Price,Currency,Nis,File_Content,File_N,File_Extension)
VALUES (1, 1, 1234, 25/09/2011, 20, 15, 300,Us,1200,varbinaryD,invoice,pdf)
הסבר לגבי כל עמודה:SupplierID - מס' ספק, MatrialsID - מס' חומר, Invoice_Number - מס' חשבונית שקיבל העסק מהספק לאחר ההזמנה, Dates - תאריך ההזמנה
quantity -כמות שהוזמנה מהחומר למשל, 10 מטר במידה והחומר הוא בד כלשהו, Price_Per_Unit - מחיר לכל מטר בד, total_Price - מחיר כולל
currency - סוג המטבע בו נעשתה הקנייה (הלקוחה קונה מספקים בחו"ל) Nis - המחיר בשקלים לאחר המרה מהמטבע בו נעשתה הקנייה לפי שער תאריך הקנייה.
file_content - אפשרות להעלות את קובץ של החשבונית שהתקבלה ושני השדות שנותרו די ברורים.
בתצורה הנוכחית איני יכול לבצע את שרציתי -שיוך כמה חומרים לרשומת הזמנה אחת מספק אחד בתאריך אחד.
העסק עובד כרגע עם אקסל אז אני אצרף דוגמה להמחשה איך הם מתעדים כרגע הזמנה יחידה מספק כלשהו שהעסק ביצע וזה אמור להתבצע כך גם בתוכנה פחות או יותר:
מקווה שעכשיו זה יותר ברור ומישהו יוכל להציע לי פיתרון.
תודה מראש
-
use QQ
go
-- חסר סגירת סוגריים בשאילתות יצירת הטבלאות
CREATE TABLE [dbo].[tblSupplierA](
[ID] [smallint] NOT NULL,
[Company_Name] [varchar](25) NULL,
[Contact_Name] [varchar](25) NULL,
[Email] [varchar](25) NULL,
[Land_Line_Number] [varchar](15) NULL,
[Mobile] [varchar](20) NULL,
[Address] [varchar](25) NULL)
CREATE TABLE [dbo].[tblSupplierA_Materials](
[SupplierA_ID] [smallint] NOT NULL,
[Materials_ID] [smallint] NOT NULL,
[Invoice_Number] [int] NULL,
[Dates] [varchar](20) NOT NULL,
[Quantity] [smallint] NULL,
[Price_Per_Pnit] [real] NULL,
[total_price] [real] NULL,
[Currency] [varchar](10) NULL,
[Nis] [float] NULL,
[File_Contant] [varbinary](max) NULL,
[File_N] [varchar](60) NULL,
[File_Extension] [char](4) NULL)
-- חבל שלא צירפת סקריפט של הכנסת כמה נתונים לטבלאות כדוגמה כדי שנוכל לבסס התחלה זהה
/*************************** טענה של שואל השאלה
הדבר ההגיוני והנכון (לדעתי) הוא שכל החומרים שהוזמנו בהזמנה אחת בפועל ישוייכו לאותה הזמנה בתאריך 25/09/11 גם במסד הנתונים דהיינו לאותה רשומה בטבלת tblSupplierA_Materials קרי טבלת ההזמנות. מכיוון שהמפתח של טבלה זו הוא הרכב של 3 שדות שצוינו לעיל, לא ניתן לשייך יותר מחומר אחד( ראה material) להזמנה מספק בתאריך מסוים.
איני מעוניין שכל הזמנה תתחלק למספר רשומות כמספר החומרים שהוזמנו כי זה מסרבל את הממשק בכמה מישורים ( למשל בכדי להציג סכום כולל ששולם עבור הזמנה אצטרך לעשות שאילתה שתחזיר לי את כל ההזמנות עם שני פרמטרים - תאריך ההזמנה ומס' הספק והשימוש ב-data grid view יהיה לא פשוט) אלא שכל הזמנה מספק בתאריך כלשהו תוכל להכיל מספר חומרים אשר הוא אינו קבוע ומגביל.
*/
/*************************** תגובה
אתה טועה לחלוטין בגישה שפיצול יוצר סירבול בעוד פיצול יוצר גמישות
חיבור נתונים נעשה ברמת מסד הנתונים בצורה פשוטה כמו בעזרת
JOIN
אתה מציג כאן יחס הכי פשוט של יחיד לרבים: כל הזמנה כוללת מספר פריטים
מדובר בשאלה מהספרים ממש שהאפיון הנכון הוא דיי חד משמעי: יחס יחיד לרבים ממשים עם טבלה נוספת מקושרת בעזרת מפתח לטבלה הראשית
למעשה דווקא כמפתח דוטנט אני מתפלא שזה האפיון שלך כי כל הרעיון העומד מאחורי מודול האובייקטים אינו בה לידי ביטוי אצלך
מודל האובייקטים שם כדגש כפי ששמו מציג את הרעיון של פיצול לאובייקטים ושימוש בירושה
האפיון הבסיסי הברור כאן צריך להיות שיש לך מחלקה של פריט/חומר
Material
יש לך אוסף של חומרים בעסק. ... למשל:
IEnumerable<Material>
הזמנה כוללת אוסף של פריטים המוכנסים להזמנה - יחס יחיד לרבים בין הזמנה לפירוט ההמנה
כשצירפת את האקסל נתת לי כיוון טוב להעריך שמקור הבעיה הוא במעבר מאקסל וגישה של פיתוח ישיר לשימוש במסדי נתונים טבלאיים ופיתוח במודול האובייקטים
האקסל מציג סיכום של ההמנה אבל בפיתוח נכון אנחנו מנסים להציג את מאחורי הקלעים של הטופס
האקסל מציג נתונים בצורה מעורבבת ללא קשר זה לזה מבחינת שורה ועמודה בעוד במבנה טבלאי אנחנו בונים את הנתונים בצורת רשומות של אובייקט מסויים
לכן כדי לעבוד עם עירבוב של נתונים עושיםש שמוש בכמה טבלאות
כאמור התכנון שלך מהיסוד פשוט אינו נכון והייתי מציע לך בשלב זה כשהדברים ברורים להעסיק יועץ חיצוני לאפיון האפיקציה אם אינך מצליח להעזר במדריכים השונים באינטרנט של חנויות וירטואליות כדי לתרגם את המבנה של חנות וירטואלית למצב שלכם
*/
/*************************** טענה של שואל השאלה */
INSERT INTO tblSupplierA_Materials
(SupplierA_ID, Materials_ID, Invoice_Number,Dates,Quantity,Price_Per_Unit,total_Price
,Currency,Nis,File_Content,File_N,File_Extension)
VALUES (1, 1, 1234, 25/09/2011, 20, 15, 300,Us,1200,varbinaryD,invoice,pdf)
/*************************** תגובה
השאילתה בכלל אינה מתאימה לטבלה שלך השדות אינם מתאימים לשאילתה של יצירת הטבלה
בדוק את הנושא והעבר לנו שאילתות תואמות
*/
/*************************** טענה של שואל השאלה
בתצורה הנוכחית איני יכול לבצע את שרציתי -שיוך כמה חומרים לרשומת הזמנה אחת מספק אחד בתאריך אחד.
*/
/*************************** תגובה
סליחה על המילה אבל זו פשוט שטות
אתה ננעל על זה שאי אפשר במקום לבצע את מה שמוצע לך כדי שכן יהיה אפשר
אם אתה מגלה שאפיון של אפליקציה לא מתאים אז תשנה את האפיון
הזמן שאתה משקיע על לחשוב כיצד להתאים את המציאות לאפיון המוטעה הוא הרבה יותר מהזמן של אפיון נכון לפי המציאות
המציאות והצרכים והיעדים קובעים את האפיון ולא האפיון קובגע את המציאות
*/
/*
לסיום: אם אתה נעול על כך שאתה רוצה לעבוד בצורה שבה כל הנתונים שמורים כמו באקסל בטבלה אחת אז גם את זה אפשר
למעשה אם אתה רוצה אפשר גם לעבוד עם שרתי מסדי נתונים מקצועיים כאילו הם כתבן פשוט
זה כמובן דרך גרועה מאוד שאינה מתאימה אבל כמו שאומרים... אם הלקוח רוצה אז תמיד אפשר למצוא פתרון
אחת השיטות לבצע זאת היא שימוש בהכנסת הנתונים לאותו שדה בטבלה תוך שימוש בפורמט המאפשר לאפליקציה לנתח את הנתונים ולהפריד אותם
למשל אתה יכול בשדה אחד בטבלה של ההזמנות להכניס את כל החומרים שהוזמנו על ידי שימוש בהפרדת פסיק כדי להפריד בין חומרים ובהפרדת @ כדי להפריד את מספר המוצרים
לדוגמה:
הוזמנו שני מוצרים מסוג X
ושלושה מוצרים מסוג Y
אז בשדה המוצרים של ההמזנה מכניסים
2@X,3@Y
שוב אני מציין שזו דרך גרועה מאוד אבל אם אתה נעול על הכנסת כל הנתונים לבטלה אחת אז זו אחת הדרכים
*/
- נערך על-ידי pituachMVP, Moderator יום שני 26 ספטמבר 2011 04:50
- הוצע כתשובה על-ידי pituachMVP, Moderator יום חמישי 06 יוני 2013 09:40
- סומן כתשובה על-ידי Guy GlantserMVP, Moderator יום חמישי 21 אוגוסט 2014 06:04
-
-