בולנט - דברים מיוחדים...

www.ASP.org.il

Israeli ASP Organization
ארגון ה-ASP הישראלי
מאמרים/דוגמאות קוד
קישורים
ספרות
חיפוש כללי:

חפש!
כלליHTMLASPASP.NETSQLמסדי נתוניםJavaScriptXML * XSLDHTML * CSSעיצוב וגרפיקהשרתיםComponentsפרסום ושיווקקידום אתריםקופירייטינגPHP
פרסומת
דף ראשי מדורים דרושים הרשמה למועדון אודותינו צור קשר
מיקום: מאמרים ודוגמאות קוד > SQL

עדכון מספר טבלאות בשאילתא אחת

בשאלה שנשאלה בפורום של ארגון מפתחי ה- ASP הישראלי רצה השואל לדעת כיצד אפשר לעדכן מספר טבלאות הקשורות ביניהם בשאילתה אחת.
אפשר - ע"י שימוש ב- UPDATE של ADO ובשאילתה מסוג DATASHAPE.

בדוגמא הבאה קיימות בבסיס הנתונים 2 טבלאות, טבלת Headers מכילה 2 שדות ID שהוא שדה IDENTITY ו title שהוא שדה מסוג varchar. הטבלה השניה Header_Desc מכילה 3 שדות ID כ- IDENTITY HeaderId הנו ה ID של השדה המגביל בטבלת HEADERS ו description הנו שדה מסוג varchar.

טעינת הנתונים

הקובץ Update_Datashape.asp מציג את הנתונים של 2 הטבלאות בצורה הירארכית:

<%@ Language=VBScript %> <% Response.CharSet= "ISO-8859-8-i" Set oConn = Server.CreateObject("ADODB.Connection") ConnStr = "Driver={SQL Server};Server=Mysev;Provider=MSDataShape;" ConnStr = ConnStr & "Uid=;Pwd=;Database=Mydb;AutoTranslate=No" oConn.Open ConnStr %> שאילתת ה DATASHAPE הבאה תביא רקורדסט שמכיל את הנתונים משתי הטבלאות בצורה הירארכית: <% SQL = "SHAPE {select * from headers} APPEND" SQL = SQL & "({ select * from header_desc} RELATE Id TO headerid) AS LEVEL" set rsDS = oConn.Execute(SQL) %>

הצגת הנתונים

את הנתונים הכנסתי לתוך שדה טקסט כדי שאפשר יהיה לעדכן אותם, נוסף על כך הוספתי Chekbox -ים, הצקבוקסים המסומנים יהיו אלו שנתוניהם יעודכנו, כמובן שאפשר לבצע את הרישום של איזה רשומות שונו ע"י צד קליינט סקריפט שיכניס לשדה HIDDEN את הנתון על מספר הרשומה שעודכנה.
השמות של כל האובייקטים הם שמות זהים בכדי ליצור מערכים בהעברת הנתונים ע"י POST ולדוג מתוכם את האלמנטים במערכים שעברו שינוי.

<form method = post action = update_datashape1.asp target = frmAction> <TABLE id=tblResults border=1 cellpadding=1 cellspacing=0 width=100> <% while not rsDS.eof Response.write "<TR><TD valign=top>" & rsDS(0) & "<td valign=top>" Response.write "<input type=text name=lev1 value="& rsDS(1) & ">" set lev2=rsDS.fields("LEVEL").value Response.write "<TD valign=top><TABLE width=100% border=1 cellpadding=1 cellspacing=0>" while not lev2.eof Response.write "<TR><td><input type=checkbox" Response.write " name=chkData value=" & lev2 (0) & "><TD>" & lev2 (0) Response.write "<TD valign=top><input type=text name=lev2 value=" & lev2 (2)& ">" lev2.movenext wend Response.write "</table>" rsDS.movenext wend %> </table> <input type=submit value="Update"><BR> </form> את ביצוע פעולת העידכון נבצע בתוך IFRAME בכדי לראות את שורות הדיבאגינג: <iframe id=frmAction name=frmAction height=200 width=600></iframe> קובץ העדכון Update_Datashape1.asp: <%@ Language=VBScript %> <% Response.CharSet= "ISO-8859-8-i" %> כדי שנהיה בטוחים שלא התקבלה שגיאה כי לא סומן אחד הצקבוקסים נעצור את התוכנית עוד לפני שהתחילה. <% if request("chkData") = "" then Response.Write "חובה לסמן לפחות צקבוקס אחד בכדי שהדמו יפעל" Response.End end if %> <% Set oConn = Server.CreateObject("ADODB.Connection") ConnStr = "Driver={SQL Server};Server=mysrv;Provider=MSDataShape;" ConnStr = ConnStr & "Uid=;Pwd=;Database=nydb;AutoTranslate=No" oConn.Open ConnStr %> נרשום את המערך של הצקבוקסים שסומנו <% response.write request("chkData") & "<BR>" %> נפרק את המערכים לגורמים <% newlev1=split( request("lev1"),",") newdata=split( request("lev2"),",") newchecked=split( request("chkData"),",") %> נייצר שוב שאילתת Datashape רק שבהבדל אחד, מתוך הטבלה השניה נביא רק את הרשומות שאמורות להתעדכן. <% set rsDS=server.CreateObject("ADODB.Recordset") SQL = "SHAPE {select * from headers} APPEND" SQL = SQL & "({ select * from header_desc where id in (" & request("chkData") & ")} “ & _ " RELATE Id TO headerid) AS LEVEL" response.write sql & "<BR>" rsDS.CursorLocation = 3 rsDS.Open SQL, oConn,1,4, adCmdTable chkCounter=0 chkCounterlev1=0 %> כאשר נרוץ על הרקורדסט שקיבלנו נעדכן את הרשומות בתוך הרקורדסט, רק לאחר שעברנו על כל הרקורדסט המשני נבצע פעולת Updatebatch, ובסוף נבצע פעולת Updatebatch על הרקורדסט הראשי. <% while not rsDS.eof rsDS.fields(1).Value = newlev1(chkCounterlev1) set lev2=rsDS.fields("LEVEL").value chkCounter= chkCounter while not lev2.eof response.write newdata(newchecked(chkCounter)-1)& "<BR>" lev2.fields(2).Value = newdata(newchecked(chkCounter)-1) chkCounter= chkCounter + 1 lev2.movenext wend lev2.UpdateBatch chkCounterlev1=chkCounterlev1 + 1 rsDS.movenext wend rsDS.UpdateBatch rsDS.Close %>

תכנות נעים!



         

מחבר: נחום גינתרמת קושי: 3  ||  עוד לא דורגכל הזכויות שמורות ל-IAO ©

© כל הזכויות שמורות ל-IAO
Lamparas y Mobiles  |   בולנט - Bolenat סטלן  |   מתכונים  |   הומו גאה  |   שמות  |   מיסטיקה וקבלה  |   Fisherman Pants סדרות טלויזיה טיסות זולות הודו נפאל תאילנד ביקורות משחקי מחשב Engineering Solutions עיצוב גרפי בפלאש לימוד צילומים תמונות ופיתוח קנוורט משאיות ישראל islands & beaches TV Series Guide חגי ישראל play online game clothes wear בניית אתר חנויות מחשבים ו-ציוד הקפי jewish holidays israeli games ישראל אופנה חולצות טישירט מעוצבות הריון לידה תינוק כוסיות ערומות קורס אימון אישי מידע על חברות רשתות ikesound car audio wholesale recetas comidas family and woman magic trip T Shirt mania Bolenat Searches Bolenat UK online video clips חיפושים מגזין מסטול ל-סטלן המצוי Hebrew learning online תכשיטים טבעות שרשראות קליפרים מצתים התפתחות הילד comparte light lamps תרופות / מחלות הדפסה על חולצות למכירה מוזיקה ישראלית תמונות סרטונים מצחיקים גידול צמחים פרחים ישראלים בעולם מתפנקים - ספא פינוק מושלם ייעוץ עסקים משפחתיים סרט קולנוע - קומדיה סאטירה כסף / שוק ההון לימוד שחיה בריכה מפסיקים לעשן סיגריות נשים אישה בחורה בחורות Bongs and Pipes Music Festivals Coca-Cola קססונית