שאלה על replication באקסס

לילךLilach

New member
שאלה על replication באקסס

הבעיה היא כזאת: כמה סניפים שבכל אחד יש MDB לוקלי. וDB מרכזי כלשהו שישב על שרת אינטרנט כלשהו (הגישה צריכה להיות ב WAN לא מספיק LAN). כיום השימוש בMDB הלוקאלי נעשה על ידי תוכנה שנכתבה ב VB . אני מנסה ללמוד על שימוש ב replication של אקסס במטרה לסנכרן את כל בסיסי הנתונים האלה , אודה מאד למי שמכיר את השיטה והתנסה בביצוע שיכפולים וסינכרון כזה באקסס,אני מחפשת במיוחד מידע על שיכפול באמצעות האינטרנט (כאמור הסניפים עצמם לא מקושרים ב LAN ולא יקושרו (בעיות תקציב) ,ניסיתי לקרוא את הHELP של ACCESS (משתמשת באקסס 2000) ,אבל אין שם מספיק מידע. אודה על מידע רלבנטי והפניה לפורומים או אתרים ,שמתמקדים ב אקסס. תודה מראש על עזרתכם !
 

לילךLilach

New member
מישהו תשובה?

זה פורום מסדי נתונים ,אז נכון שאקסס הוא לא פאר היצירה אבל תשובה מישהו??????
 
רעיון.

קודם כל - אם לא עונים זה לא מרוע, כנראה אף אחד לא התנסה בזה באמת.
אני אישית לא מבין ב replication של אקסס, אבל לדעתי זאת לא הבעיה שלך. הבעיה היא לתקשר עם אקסס דרך האינטרנט. ראיתי כבר כמה שאלות בנושא - בפורום הזה, בפורום XML ובפורום VB. בגדול - אין ממש דרך להתחבר לאקסס דרך האינטרנט, הוא לא בנוי לזה. הוא לוקאלי. בזמנו העלנו בפורום VB פתרון די פשוט בעזרת ASP ו-XML - דף ASP שמקבל שאילתת SQL, מריץ אותה על האקסס, ומחזיר את התוצאה ב XML. מי שקורא לדף ASP זו תוכנה שמקבלת את ה XML חזרה, מתרגמת אותו ל recordset וככה היא יכולה לקבל נתונים מאקסס מרוחק. (כל התרגום מהרקורדסט ל-XML וחזרה נעשה ע"י האוביקט רקורדסט בעצמו) לדעתי את צריכה לפתח איזושהי תוכנה שתשב על השרת המרכזי ותעדכן את כל האקססים אחד אחד בצורה כזאת. אשמח לעזור בכזה פרויקט אם תחליטי לעשות את זה. נראה לי מעניין.
 

לילךLilach

New member
תודה - מה שכתבת זאת בדיוק המטרה שלי

עכשיו התחלתי לנסות לכתוב משהו כזה בJAVA עם SERVLET. הקליינט אמור לאסוף את הנתונים מבסיס הנתונים ,אני מתקשרת אליו ב JDBC לקישור ב DSN ,קוראת את הרשומות ושולחת אוסף של STRINGS ל SERVLET שאמור להכניס את הרשומות לMDB שני שיושב בשרת. בנתיים זה לא עובד
ומזכיר לי שבמקום להסתובב האינטרנט אני צריכה לחזור לזה
. אין לי שמץ מושג ב XML. איך לדעתך כדאי לי לעשות את זה?
 
ב java אני לא כ"כ יכול לעזור

אני יודע java באופן ממש בסיסי, בטח לא מבין כלום ב servlets.
הפתרון שהוצע בעבר לבעיה הזאת - אם אתה מכירה ADO - לאוביקט recordset יש אפשרות לשמור ולקרוא נתונים מ XML (לקרוא מ XML שרקורדסט אחר ייצר). יוצרים דף ASP שמקבל שאילתת SQL, מריץ אותה, ועושה Save לרקורדסט לתוך האוביקט Response של ה ASP כשהשיטת שמירה היא adXML. זה אומר שהתוצאה של הדף ASP זה ה XML שהרקורסט ייצר. מי שפותח את הדף ASP זה אוביקט רקורסט אחר. יוצרים רקורדסט חדש, ובתור ה Source שלו נותנים את הכתובת של הדף ASP (כולל השאילתה בתור פרמטר). מה שהוא יעשה זה ייקרא את ה XML ויכניס אותו לתוך הרקורדסט - ואז בעצם העברנו רקורדסט של אקסס ממחשב אחד באינטרנט למחשב אחר. מכאן פשוט עושים מה שרוצים עם המידע על השרת. אפשר גם לעשות את זה הפוך - להעביר רקורדסט בצורת XML מהשרת ללקוח, עם דף ASP שמקבל את הXML ומכניס אותו לרקורדסט. הבעיה היא שאני לא חושב שיש ADO ל java.
אבל למרות שאני לא מכיר את ה jdbc או איזה אוביקטים java נותנת לעבודה עם דטהבייסים, בגלל ש java זה java, בטוח יש דרך לעשות את אותו דבר בדיוק עם XML בקלות, באותו רעיון - במקום ASP לעשות JSP, במקום ADO - את המקבילה ה javaית. או שתקחי לעצמך יום ותלמדי קצת ASP ו VB וזהו.
 

לילךLilach

New member
אני לא נעולה על JAVA

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

לילךLilach

New member
ניסיתי וזה עובד ,בנתיים לכיוון אחד

כלומר הצלחתי לקשר את תוכנית ה VB לMDB בברינקסטר ולקלוט את כל הרשומות בהתאם למשפט ה SQL לתוך DATAGRID ב VB !!!!! בכל מקרה ,יש לי RECORDSET עם כל הרשומות ב VB אז אני יכולה לעשות מה שצריך,כלומר בודאי לקלוט לתוך ה MDB המקומי ,את כל העידכונים שאני צריכה. עכשיו אני רק צריכה להבין ,איך עובד הצד השני ,כלומר ,איך אני יוצרת קובץ XML ב VB ואיך אני מעבירה אותו בצורה אוטומטית לתוך ה MDB שיושב בברינקסטר. ברגע שזה יעשה ,אז אפשר להגיד שזה כמעט הפתרון שאותו אני צריכה. אז אם יש לך רעיון איך לבצע את זה,אשמח מאד מאד לשמוע. נחמד מאד לדעת שיש פתרונות כמו ה Recordset Persistence !!!!!
 
אולי...

ליצור את ה XML ב VB זה בדיוק כמו ליצור אותו ב ASP - בעזרת Save. להעביר אותו ללקוח.... תנסי אולי להכין דף ASP שמקבל כפרמטר את ה XML. אני רק לא בטוח אם אפשר להעביר הרבה מידע בתור פרמטר... אם לא - תשמרי את ה XML באופן זמני על השרת, ותעבירי כפרמטר את כתובת המסמך XML על השרת לדף ASP בלקוח, שייקרא אותו משם לתוך Recordset וייעשה בדיוק מה שהשרת עושה ב VB. רק צריך למצוא דרך למחוק את הדף XML הזה אחרי שקוראים אותו... אם יש דרך לחכות עד סיום הפעלת הדף ASP מרגע הקריאה אליו - אז פשוט קוראים לדף ASP בלקוח, מחכים שהוא יסיים, ומוחקים. אם לא - אפשר להכין עוד דף ASP בשרת שברגע שקוראים לו מוחק את ה XML הזמני, ושהלקוח ייקרא לו ברגע שהוא רוצה למחוק את ה XML הזמני.
 

לילךLilach

New member
הצלחתי לקרוא קובץ XML מהקליינט אבל

עכשיו יש לי בעיה להכניס את הנתונים ל MDB שיושב בשרת ,בדיוק אותו הסקריפט עובד לי ,כאשר אני מכניסה נתונים מ טופס. הנה כל התהליך: 1. קובץ XML שיושב על הקליינט ונראה ככה (ההתחלה שלו): <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Edited with XML Spy v4.2 --> <CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> <CD> <TITLE>Hide your heart</TITLE> <ARTIST>Bonnie Tyler</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>CBS Records</COMPANY> <PRICE>9.90</PRICE> <YEAR>1988</YEAR> </CD> 2. קובץ HTML שיושב על הקליינט ושולח את הנתונים ל שרת ונראה ככה: html> <body> please wait <br> <script type="text/javascript"> var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP") xmlHttp.open("GET", "note.xml", false) xmlHttp.send() xmlDoc=xmlHttp.responseText xmlHttp.open("POST", "http://www16.brinkster.com/ofek2002/db/xml/demo_dom_http.asp", false) xmlHttp.send(xmlDoc) document.write(xmlHttp.responseText) </script> <br> end of script </body> </html> 3. קובץ ה ASP שיושב על השרת בברינקסטר ונראה ככה: <% Dim xmldoc dim dsn,conn,sSQL,Url dim zero Dim i Dim name zero=0 Dim CN,RS,strQuery,strDBLocation,strConnection Url="cds.mdb" dsn="DBQ=" & Server.Mappath(Url) & ";Driver={Microsoft Access Driver (*.mdb)};" set CN=server.createobject("adodb.connection") set RS=server.createobject("adodb.recordset") CN.open dsn set xmldoc = Server.CreateObject("Microsoft.XMLDOM") xmldoc.async=false xmldoc.load(request) for each x in xmlDoc.documentElement.childNodes sSQL = "" sSQL = sSQL & "INSERT INTO tbl_cds (TITLE,ARTIST,COUNTRY,COMPANY,PRICE,YEAR ) " sSQL = sSQL & "VALUES(´" for i=0 to 5 name= x.childnodes(i).text if i=5 then sSQL = sSQL & name & "´)" else sSQL = sSQL & name & "´,´" end if CN.Execute(sSQL) ´response.write(x.childnodes(i).nodeName & ":" & x.childnodes(i).text & "<br />") next Response.Write(sSql & "<br>") next ´close the connection CN.Close() %> הבעיה שכשאני מריצה את כל העסק ,אני מקבלת הודעת שגיאה כשאני מכיניסה את הנתונים ל MDB על השרת. הודעת השגיאה: : Microsoft OLE DB Provider for ODBC Drivers error ´80040e14´ [Microsoft][ODBC Microsoft Access Driver] Syntax error in string in query expression ´´´. /ofek2002/db/xml/demo_dom_http.asp, line 34 אני מצרפת צילום של מבנה הטבלה בMDB ו צילום של הדפסה של ה SQL לפני ביצוע ה INSERT אני אל מצליחה למצוא את השגיאה ומדוע הוא לא מכניס את הנתונים.
 
אמנם לא לזה התכוון המשורר.... ../images/Emo13.gif

לדעתי הדרך שהצעתי יותר פשוטה, אבל לא קריטי. נדמה לי שאני יודע מה הבעיה. יש לך לולאה שעוברת על כל node ב XML:
for each x in xmlDoc.documentElement.childNodes​
(אגב, לא הגדרת את המשתנה x. ב VBSCRIPT זה לא קריטי, אבל מומלץ, לצורך הסדר) בתוכה יש עוד לולאה שעוברת על כל אחד מהאלמנטים ומוסיפה את הערך שלו לקטע VALUES בשאילתה, ולאחר מכן בודקת האם זה האלמנט האחרון או לא ומוסיפה פסיק או סוגריים בהתאם. ועכשיו הבעיה - במקום לעבור על כל האלמנטים שבnode, להוסיף אותם לשאילתה ואז לשלוח אותה, את שולחת את השאילתה אחרי הוספה של כל ערך - ה Execute צריך להיות אחרי ה next של הלולאה הפנימית. מה שקורה עכשיו זה שהוא שולח משהו כזה:
INSERT INTO ....... VALUES (´somevalue´,​
ואז את זה:
INSERT INTO ....... VALUES (´somevalue´,´someothervalue´​
והוא ממשיך לשלוח את השאילתה בכל שלב עוד לפני שהיא מוכנה. מן הסתם כבר בפעם הראשונה הוא נעצר ומודיע על שגיאה. בקיצור - צריך להוציא את ה Execute מחוץ ללולאה הפנימית, וגם יותר יעיל יהיה להוריד את ה IF שבודק אם זה אלמנט 5, ופשוט להוסיף כל פעם "," ,ואחרי הלולאה הפנימית, לפני ה Execute, להוריד את הפסיק האחרון ולשים במקומו "(".
 

לילךLilach

New member
אוקיי זה נפתר לי

זאת היתה בעיה במשפט ה SQL אין לי מושג מה הבעיה אבל כתבתי אותו מחדש ועכשיו זה עובד
 

לילךLilach

New member
טוב עכשיו עוד שאלה

יש אפשרות להריץ קובץ HTML מתוך VB???? בצורה אוטומטית כי אני צריכה להריץ את הקובץ HTML כדי שישלח את ה XML לSERVER אני אנצל את ההזדמנות הזאת שוב להודות לך ,כי בלי הרעיון שלך ,לא היה לי מושג מה זה XML ולא הייתי חושבת על בכיוון הזה בכלל.
 
בטח שאפשר

אפשרות אחת היא להפעיל את הדפדפן בעזרת ShellExecute:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Temp = "http://myhost.com/mypage.html" Result = ShellExecute(hWnd, "open", Temp, vbNull, vbNull, 1)​
או להוסיף לתוכנה פקד WebBrowser ולעשות את זה דרכו (נדמה שהפונקציה שם היא Navigate. לא בטוח. תבדקי ב MSDN) ואין בעד מה.
 

לילךLilach

New member
תודה זה עובד מצויין

איך אני נפתרת מהערת ההזהרה של האקספךורר שמאלצת התערבות ידנית. ראה את ה´ובץ המצורף. האם אני יכולה לענות שם YES אוטומטי שנשלח מה VB ?
 

לילךLilach

New member
לא הצלחתי

אני לא רוצה להפסיק את ההבטחה לגמרי ניסיתי להוסיף את האתר שבו יושב ה ASP לאתר בטוח ולא עזר , אני ממשיכה לקבל את ההודעה המעצבנת.
 
נהייה קצת OFFTOPIC כל השרשור ../images/Emo13.gif

אבל בכל מקרה - למה שלא תריצי את הקוד הזה מתוך ה VB וזהו? למה להריץ אותו בתור דף HTML? אותו קוד בדיוק יעבוד יופי כקוד VB. אם גם ככה את מפעילה תוכנת VB, זה יהיה יותר יעיל, וגם יעבוד לך בלי ההודעות האלה כי ה IE לא יהיה בתמונה בכלל.
 

לילךLilach

New member
יש אותה הודעה גם מתוך VB

מכיון שהפקד: WebBrowser מפעיל את ה IE ולכן מפעיל גם את ההודעה.
 
למעלה